我試圖解決以下問題字謎時間複雜度
您將得到兩個字符串。大小爲n的B,大小爲m的B。與n相比,m是非常非常非常小的數字。找出一個包含子這 是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;
}
正如你可以看到我提取從頭開始的長度爲m每串的字符串A並檢查它是否是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的時間複雜度是多少?整體代碼是線性的還是二次的?