タイトルの説明(ポータル)
文字列を指定して、最初の一意の文字を見つけ、そのインデックスを返します。存在しない場合は-1が返されます。
例
s = "leetcode"
返回 0
s = "loveleetcode"
返回 2
アイデア
二次元配列
26 * 2の2次元配列を作成し、それを行列として扱います。最初の行には、文字列内の位置に対応する文字列の各文字の添え字が格納され、2番目の行にはその出現回数が格納されます。これは、最初のforループでもあります。
2番目のforループは、配列の2番目の行をトラバースし、数値が1の場合、最初の行の添え字を返します。
public int firstUniqChar(String s) {
//char[] array = s.toCharArray();
int[][] index = new int[26][2];
for (int i = 0; i < s.length(); i++) {
index[s.charAt(i) - 'a'][0] = i;
index[s.charAt(i) - 'a'][1] = index[s.charAt(i) - 'a'][1] + 1;
}
for (int i = 0; i < s.length(); i++) {
if (index[s.charAt(i)-'a'][1] == 1) {
return index[s.charAt(i)-'a'][0];
}
}
return -1;
}
HashMap
ハッシュテーブルを介して出現回数をカウントし、トラバースして検索します
public int firstUniqChar(String s) {
Map<Character, Integer> map = new HashMap();
char[] chars = s.toCharArray();
//先统计每个字符的数量
for (char ch : chars) {
map.put(ch, map.getOrDefault(ch, 0) + 1);
}
//然后在遍历字符串s中的字符,如果出现次数是1就直接返回
for (int i = 0; i < s.length(); i++) {
if (map.get(chars[i]) == 1) {
return i;
}
}
return -1;
}
indexOf && lastIndexOf API
public int firstUniqChar(String s) {
for (int i = 0; i < s.length(); i++) {
if (s.indexOf(s.charAt(i)) == s.lastIndexOf(s.charAt(i))) {
return i;
}
}
return -1;
}