【发布时间】:2014-02-02 20:20:50
【问题描述】:
输入:str="abcdeefuiuiwiwwaaaa" n=3 输出:“iwiwwaaaa”(最长的 substr,3 个 diff 字符)
我有一个解决方案如下。我的问题:
- 时间复杂度如何? 我知道它一定比 O(n^2) 好,但不确定是否可以断定它是 O(n)。
-
下面的解决方案不能覆盖整个ASCII,我们可以在没有额外空间的情况下改进它吗?
public static String getSubstrOfMChars(String str, int m) { if (str==null || str.length()==0) return ""; int len = str.length(); String max = ""; for(int i=0; i<len;) { StringBuilder sb = new StringBuilder(); int counter = 1; int checker = 0; char firstChar = str.charAt(i); int firstCharPos = i; // first char position in the string sb.append(firstChar); checker |= 1 << (firstChar - 'a'); for(int j=i+1; j<len; j++) { char currChar = str.charAt(j); if (currChar == firstChar) firstCharPos++; int tester = checker & (1<<(currChar - 'a')); if ( tester > 0 ) // already have such character { sb.append(currChar); continue; } // new character if (++counter > m) { i = firstCharPos + 1; if (sb.length() > max.length()) { max = sb.toString(); } break; } sb.append(currChar); checker |= 1 << (currChar - 'a'); } if (counter <= m) { if ((counter==m) && sb.length() > max.length()) { max = sb.toString(); } break; } } return max; }
【问题讨论】:
-
您的算法最多可以容纳 32 个值进行检查,因为您使用的是
ints。我会仔细检查声明I know it must be better than O(n^2)...。如需帮助,请查看1+2+3...+N的总和。 -
提示:想想当你遍历第一个 for 循环时 j 的值是如何变化的。
标签: algorithm