字符串中的第一个唯一字符
官方的代码
1.使用哈希表存储频数
class Solution {
public:
int firstUniqChar(string s) {
unordered_map<int, int> frequency;
for (char ch: s) {
++frequency[ch];
}
for (int i = 0; i < s.size(); ++i) {
if (frequency[s[i]] == 1) {
return i;
}
}
return -1;
}
};
2.使用哈希表存储索引
class Solution {
public:
int firstUniqChar(string s) {
unordered_map<int, int> position;
int n = s.size();
for (int i = 0; i < n; ++i) {
if (position.count(s[i])) {
position[s[i]] = -1;
}
else {
position[s[i]] = i;
}
}
int first = n;
for (auto [_, pos]: position) {
if (pos != -1 && pos < first) {
first = pos;
}
}
if (first == n) {
first = -1;
}
return first;
}
};
3.队列
class Solution {
public int firstUniqChar(String s) {
Map<Character, Integer> position = new HashMap<Character, Integer>();
Queue<Pair> queue = new LinkedList<Pair>();
int n = s.length();
for (int i = 0; i < n; ++i) {
char ch = s.charAt(i);
if (!position.containsKey(ch)) {
position.put(ch, i);
queue.offer(new Pair(ch, i));
} else {
position.put(ch, -1);
while (!queue.isEmpty() && position.get(queue.peek().ch) == -1) {
queue.poll();
}
}
}
return queue.isEmpty() ? -1 : queue.poll().pos;
}
class Pair {
char ch;
int pos;
Pair(char ch, int pos) {
this.ch = ch;
this.pos = pos;
}
}
}
我的代码
package first_unique_character_in_a_string;
public class Solution1 {
public int firstUniqChar(String s) {
int fuc = -1;
char[] arr = s.toCharArray();
int[] zimu = new int[26];
for (int i = 0; i < arr.length; i++) {
int c = arr[i]-97;
zimu[c] += 1;
}
for (int i = 0; i < arr.length; i++) {
int c = arr[i]-97;
if(zimu[c]==1) {
fuc = i;
break;
}
}
return fuc;
}
public static void main(String[] args) {
System.out.println(new Solution1()
.firstUniqChar("leetcode"));
}
}