字母異位詞分組
給定乙個字串陣列,將字母異位片語合在一起。字母異位詞指字母相同,但排列不同的字串。
示例:
輸入:說明:["eat", "tea", "tan", "ate", "nat", "bat"]
輸出:[["ate","eat","tea"],
["nat","tan"],
["bat"]
]
方法一:排序陣列分類
維護乙個對映,key為字串中字元的最小字典序,value為排列不同的字串
public list> groupanagrams(string strs)
map.get(string.valueof(chars)).add(s);
}return new arraylist<>(map.values());
}
時間複雜度:o(nklogk),其中 n 是 strs 的長度,而 k 是 strs 中字串的最大長度
方法二:按計數分類
根據每個字串中字母出現的次數構造字串,作為key
public list> groupanagrams(string strs)
stringbuilder sb = new stringbuilder();
for (int count : counts)
string key = sb.tostring();
if (!map.containskey(key))
map.get(key).add(s);
}return new arraylist<>(map.values());
}
時間複雜度o(nk)
找到字串中所有字母異位詞
給定乙個字串 **s **和乙個非空字串p,找到 **s **中所有是 **p **的字母異位詞的子串,返回這些子串的起始索引。
字串只包含小寫英文本母,並且字串 **s **和 **p **的長度都不超過 20100。
說明:
示例 1:
輸入:s: "cbaebabacd" p: "abc"輸出:[0, 6]解釋:示例 2:起始索引等於 0 的子串是 "cba", 它是 "abc" 的字母異位詞。
起始索引等於 6 的子串是 "bac", 它是 "abc" 的字母異位詞。
輸入:s: "abab" p: "ab"輸出:[0, 1, 2]解釋:方法一:暴力(超時)起始索引等於 0 的子串是 "ab", 它是 "ab" 的字母異位詞。
起始索引等於 1 的子串是 "ba", 它是 "ab" 的字母異位詞。
起始索引等於 2 的子串是 "ab", 它是 "ab" 的字母異位詞
依次判斷s中所有長度和p的長度相同的子串和p是否是異位詞
public listfindanagrams(string s, string p)
arrays.sort(temp);
if (arrays.tostring(temp).equals(arrays.tostring(pchars)))
}return ans;
}
方法二:滑動視窗
先用乙個map存在p中字母存在的次數,再用乙個map存滑動視窗中字母存在的次數
滑動視窗指標i,j,每次j向右移動,更新j對應字母出現的次數,如果比p中map的大,i指標向右移動,直到不比map大,i在移動過程中也要更新次數,如果視窗大小和p的長度相等,說明找到了乙個滿足條件的值
public listfindanagrams(string s, string p)
int i = 0, j = 0;
int smap = new int[26];
while (j < s.length())
if (j - i == p.length())
}return ans;
}
字母異位詞
描述 給定兩個字串 s 和 t 編寫乙個函式來判斷 t 是否是 s 的字母異位詞。示例 1 輸入 s anagram t nagaram 輸出 true 示例 2 輸入 s rat t car 輸出 false 思路和 思路1 雜湊 class solution int lens s.size in...
字母異位詞分組
超出時間限制 依次遍歷陣列中每乙個字串,與list中每乙個templist中的第乙個進行對比,如果長度不相等即為不合格,如果list走到了結尾,字串肯定不包含與list中,新增成為list中新的一員。如果與templist中一樣則為新增為templist中一員 但是超出時間限制 public lis...
字母異位詞分組
給定乙個字串陣列,將字母異位片語合在一起。字母異位詞指字母相同,但排列不同的字串。示例 輸入 eat tea tan ate nat bat 輸出 ate eat tea nat tan bat 思路 遍歷string陣列,對每個string排序,然後以鍵形式存入雜湊表中,雜湊表鍵為排序後的stri...