题目描述:
Given a string, find the first non-repeating character in it and return it's index. If it doesn't exist, return -1.
思路一:
class Solution {
public int firstUniqChar(String s) {
if (s == null || s.length() == 0)
return -1;
int[] buckets = new int[26];
for (char c : s.toCharArray())
buckets[c - 'a']++;
for (int i = 0; i < s.length(); i++)
if (buckets[s.charAt(i) - 'a'] == 1)
return i;
return -1;
}
}
思路二:
class Solution {
public int firstUniqChar(String s) {
if (s == null || s.length() == 0)
return -1;
char[] chars = s.toCharArray();
for (int i = 0; i < chars.length; i++)
{
if (chars[i] != '0')
{
int count = 1;
for (int j = i + 1; j < chars.length; j++)
{
if (chars[i] == chars[j])
{
chars[j] = '0';
count++;
}
}
if (count == 1)
return i;
}
}
return -1;
}
}
思路三:
class Solution {
public int firstUniqChar(String s) {
if (s == null || s.length() == 0)
return -1;
HashMap<Character, Integer> map = new HashMap<>();
for (char c : s.toCharArray())
{
if (map.containsKey(c))
map.put(c, map.get(c) + 1);
else
map.put(c, 1);
}
for (int i = 0; i < s.length(); i++)
if (map.get(s.charAt(i)) == 1)
return i;
return -1;
}
}
思路四:
使用两个指针变量,slow指向current unique character,fast扫描整个字符串
class Solution {
public int firstUniqChar(String s) {
if (s == null || s.length() == 0)
return -1;
if (s.length() == 1)
return 0;
char[] chars = s.toCharArray();
int slow = 0;
int fast = 1;
int[] count = new int[26];
count[chars[slow] - 'a']++;
while (fast < s.length())
{
count[chars[fast] - 'a']++;
while (slow < s.length() && count[chars[slow] - 'a'] > 1)
slow++;
if (slow >= s.length())
return -1;
if (count[chars[slow] - 'a'] == 0)
{
count[chars[slow] - 'a']++;
fast = slow;
}
fast++;
}
return slow;
}
}
思路五:
class Solution {
public int firstUniqChar(String s) {
if (s == null || s.length() == 0)
return -1;
if (s.length() == 1)
return 0;
for (int i = 0; i < s.length(); i++)
if (s.indexOf(s.charAt(i)) == s.lastIndexOf(s.charAt(i)))
return i;
return -1;
}
}