1.タイトル
文字列に1回だけ出現する最初の文字(0 <=文字列の長さ<= 10000、すべて文字で構成)を見つけ、その位置を返します。そうでない場合は、-1(大文字と小文字を区別)を返します。
2、分析とコード
1.ハッシュテーブル
(1)考える
この質問の直感的なアイデアは、文字列をトラバースするプロセスで、文字がO(1)時間計算量内に出現して記録されたかどうかが判断されるため、全体的な複雑さはO(n)で制御されるということです。
このアイデアはハッシュテーブルと組み合わせて実現でき、最適化できるポイントは2つあります
。1)文字数に制限があり、ASCIIコードと組み合わせて直接連続数に変換できるため、ハッシュテーブル配列関数で実現できます
。2)ハッシュテーブルに表示される文字数を記録する場合は、文字の位置を再度トラバースする必要があるため、文字の位置を直接記録し、繰り返し文字を記録することができます。たとえば、出現した文字の位置を-1と記録し、繰り返し出現した位置を-2と記録し、最初の出現位置を記録することで、必要な回答を得ることができます。 1回のトラバース中に。
(2)コード
public class Solution {
public int FirstNotRepeatingChar(String str) {
if (str.length() == 0)
return -1;
int[] chars = new int[58];
for (int i = 0; i < 58; i++)
chars[i] = -1;
int base = (int)'A';
for (int i = 0; i < str.length(); i++) {
int index = (int)str.charAt(i) - base;
if (chars[index] == -1)
chars[index] = i;
else if (chars[index] > -1)
chars[index] = -2;
}
int ans = -1;
for (int i = 0; i < 58; i++)
if (chars[i] > -1 && (ans == -1 || chars[i] < ans))
ans = chars[i];
return ans;
}
}
(3)結果
実行時間:28ms、占有メモリ:9468k。
3、その他
何もありません。