今日、leecodeは基本的なアルゴリズムの問題を見ました。私の考えは非常に微妙だと感じています。これにより、学習のために記録します
記事のディレクトリ
1.効果的な文字のバリエーション
文字の不快感は、2つの文字列の文字が同じであり、数が同じであり、順序が無視できることを意味します。
1ブルートフォースクラッキング
私の考えは、マップを使用して各文字の数を数え、次に2つのマップをトラバースすることです。比較します。2つのマップのネストされたトラバーサルの時間計算量はO(N²)です。スペースの複雑さはO(N)です。
コードは次のように表示されます。
public boolean isAnagram(String s, String t) {
if (s.length() != t.length())
return false;
if (s.length() == 0) {
return true;
}
Map<Character,Integer> ms=new HashMap<>();
Map<Character,Integer> mt=new HashMap<>();
char[] chs = s.toCharArray();
char[] cht = t.toCharArray();
for (int i=0;i<chs.length;i++){
ms.put(chs[i],ms.getOrDefault(chs[i],0)+1);
}
for (int j=0;j<cht.length;j++){
mt.put(cht[j],mt.getOrDefault(cht[j],0)+1);
}
for (Map.Entry<Character,Integer> s1:ms.entrySet()){
for(Map.Entry<Character,Integer> s2:mt.entrySet()){
Character key = s1.getKey();
if(mt.get(key)==null || !mt.get(key).equals(s1.getValue())){
return false;
}
}
}
return true;
}
統計結果から、26%未満の時間しかかかりませんでした。
2配列を使用する
2つの文字配列を並べ替えてから、2つの配列が等しいかどうかを判別します。これも解決できます。時間計算量は、ソートアルゴリズムによって異なります。平均はO(nlogn)です
public boolean isAnagram(String s, String t) {
//特判,长度不同必定不是
if (s.length()!=t.length()) return false;
//两个字符串排序后是否相等
char[] array1 = s.toCharArray();
char[] array2 = t.toCharArray();
Arrays.sort(array1);
Arrays.sort(array2);
return Arrays.equals(array1,array2);
}
これはすでに非常に強力です。
3カスタムハッシュ操作
まず、2つの文字列を文字配列に変換します。長さが26の文字配列を定義します。格納されるのは、sの各文字に対応するASCIIコードテーブル値とaのコードテーブル値の差です。複数ある場合は、それ自体で増やします。tはそれ自体をデクリメントするだけです。最後に、この配列がすべて0であるかどうかを確認します。
public static boolean isAnagram(String s, String t) {
//总共有26个字母
char[] arr = new char[26];
char[] chs = s.toCharArray();
char[] cht = t.toCharArray();
//
for (int i = 0; i < chs.length; i++) {
arr[chs[i] - 'a']++;
}
for (int j = 0; j < cht.length; j++) {
arr[cht[j] - 'a']--;
}
for (int k = 0; k < 26; k++) {
if (arr[k] != 0) {
return false;
}
}
return true;
}