LoginSignup
0
0

More than 5 years have passed since last update.

文字列に重複する文字があるかどうかの判定

Last updated at Posted at 2019-01-01
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
typedef unsigned int uint;
// O(N)
bool is_unique3(string line){
  uint size = line.size();
  if(size>256)return false;
  int flag=0;
  uint i;
  for(i=0;i<size;i++){
    int val = line[i]-'a';
    if(flag&(1<<val))return false;
    flag|=(1<<val);
  }
  return true;
}
// O(NlogN)
bool is_unique2(string line){
  sort(line.begin(),line.end());
  uint i;
  uint size=line.size();
  for(i=1;i<size;i++){
    if(line[i-1]==line[i]){
      return false;
    }
  }
  return true;
}
// O(N^2)
bool is_unique(string line){
  uint size=line.size();
  uint i,j;
  for(i=0;i<size;i++)
    for(j=i+1;j<size;j++)
      if(line[i]==line[j])return false;
  return true;
}
int main(){
  string line;
  cin>>line;
  if(is_unique3(line))cout<<"unique"<<endl;
  else cout<<"not unique"<<endl;
  return 0;
}
  • 関数is_uniqueはある文字がそれ以降に出現するかどうかで判定。計算量はO(N^2)
  • 関数is_unique2は文字列をソートして、i-1番目とi番目を比較して判定。計算量はO(NlogN)
  • 関数is_unique3は出現した文字をビットベクトルで記録していって判定。計算量はO(N)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0