文字列 s のすべての文字が異なるかどうかを判断するアルゴリズムを実装します。
例 1:
入力: s = "leetcode"
出力: false
例 2:
入力: s = "abc"
出力: true
この問題について考える最も簡単な方法は、最初に並べ替えてから、ループを使用して前後の要素が等しいかどうかを判断することです。時間計算量は少なくとも O(nlogn) です。
また、set deduplication または unowned_map のキーと値のペアを使用して、線形計算量を達成することもできます。ただし、追加のスペースが必要です。小さな点として、キーと値のペアの値が int の場合、初期化のデフォルトは 0 であり、値を割り当てる必要はありません。最も考えにくいのはビット演算です
。 int 0 を標準要素として設定します。毎回、文字と a の差と 0 のビットごとの OR が取られます。このとき、ビットが 1 であれば、その文字が存在することを意味します。次に、ビットごとの AND 演算を実行します。2 回発生した場合は、ビットごとの論理和の結果になります。 AND は 1 である必要があります。 false を返すことができます。
class Solution {
public:
bool isUnique(string astr) {
// int n=astr.length();
// if(n==0)
// return true;
// unordered_set<char> tmp;
// for(int i=0;i<n;i++)
// {
// tmp.emplace(astr[i]);
// }
// int m=tmp.size();
// if(m==n)
// return true;
// else
// return false;
//
// unordered_map<char,int> hash;//value默认为0
// int n=astr.length();
// int flag=1;
// if(n==0)
// return true;
// for(int i=0;i<n;i++)
// {
// hash[astr[i]]+=1;
// }
// for(auto iter=hash.begin();iter!=hash.end();iter++)
// {
// if(iter->second>1)
// {
// flag=0;
// break;
// }
// }
// if(flag==1)
// return true;
// else
// return false;
///
int cnn=0;
int n=astr.size();
if(n==0)
return true;
for(int i=0;i<n;i++)
{
if(cnn&(1<<(astr[i]-'a')))
return false;
cnn=cnn|(1<<(astr[i]-'a'));
}
return true;
}
};
ただし、int は 32 ビットしかないため、32 種類の文字しか判定できません。この問題のテストケースはすべて小文字なので合格します。その他の特殊文字が含まれる場合は、必ずしも合格するとは限りません。少なくとも 128 ビットである必要があるため、この方法は賢明ですが、すべての状況に適しているわけではありません。