【Java,面接】1文字列のすべての文字が異なるかどうかを決定するアルゴリズムを実現

1124 ワード

//method to figure out if there's no duplicate char in a ASCII string

import java.lang.String


boolean isUniquedChars(String myString)
{
	if(myString.length() > 256)
		return false;
	
	boolean[] char_set = new boolean[256];
	for (int i = 0; i < myString.length(); i++)
	{
		int val = myString.charAt(i);
		if (char_set[val])
		{ return false; }
		char_set[val] = true;
	}
	return true;
}



//method 2
boolean isUniquedChars_method2(String str)
{
	if (str.length() > 256)
	{
		return false;
	}
	
	int checker = 0;
	for (int i = 0; i < str.length(); i++)
	{
		int val = str.charAt(i) - 'a';
		if (checker & (1 << val) > 0)
		{return false;}
		checker |= (1 << val);
	}
	return true;
}

1つのアルゴリズムを実装し、1つの文字列のすべての文字が異なるかどうかを決定します.
まず文字列がASCIIなのかUnicodeなのかを尋ねますが、両者の違いはunicodeがより大きなストレージスペースを必要とすることだけです.
以上の2つの方法のうち,第1の方法の時間的複雑度はO(n),空間的複雑度はO(1)であった.
第2の方法は,ビット演算により空間振幅を元の1/8に減少させ(コード仮定文字列は小文字のaからzのみを含む),時間複雑度は変わらない.
他にも解法があります.
文字列の各文字を他の文字と比較すると、時間複雑度O(n 2)、空間複雑度O(1)
文字列の時間的複雑度O(nlog(n))のソートを行い、隣接文字が完全に同じであるかどうかを線形にチェックします.