【发布时间】:2014-01-09 14:13:34
【问题描述】:
我正在尝试解决以下问题
给你两个字符串。大小为 n 的 A,大小为 m 的 B。 m是一个非常非常 与 n 相比,数字很小。找出 A 是否包含一个子字符串 是 B 的字谜。
我采取的方法如下
public static boolean ana_check(String a, String b)
{
int n=a.length();
int m=b.length();
boolean k;
for(int i=0;i<=(n-m);i++){
k= anagram((a.substring(i,i+m)),b);
if(k)
return true;
}
return false;
}
如你所见,我从字符串 A 的开头提取每个长度为 m 的字符串,并检查它是否是 B 的变位词。 为了检查字谜,我为每个字符串构建了一个频率图,如果发现它们相同,我返回 true。代码如下:
public static boolean anagram(String s, String t) {
// Strings of unequal lengths can't be anagrams
if(s.length() != t.length()) {
return false;
}
// They're anagrams if both produce the same 'frequency map'
return frequencyMap(s).equals(frequencyMap(t));
}
private static Map<Character, Integer> frequencyMap(String str) {
Map<Character, Integer> map = new HashMap<Character, Integer>();
for(char c : str.toLowerCase().toCharArray()) {
Integer frequency = map.get(c);
map.put(c, frequency == null ? 1 : frequency+1);
}
return map;
}
我相信 anagram 方法在 O(n) 时间运行。 ana_check 方法的时间复杂度是多少?整体代码是线性的还是二次的?
【问题讨论】:
标签: string substring time-complexity anagram