问题描述
给定一个字符串,找出第一个不重复出现的字符,并返回
其位置下标,否则返回-1。
如,
s = "leetcode"
return 0.
s = "loveleetcode",
return 2.
假设字符串仅包含小写字母。
算法描述
比较好的方法是线性算法,无论如何,为确认字符只出现一次,我们都
得遍历整个字符串。
我们可以访问每个字符,把它们出现的次数记录在哈希表中,这将耗费
O(N)的时间,其中N是字符串的长度。
然后我们再遍历一次字符串,参考之前创建的哈希表判断当前访问的字
符是否仅出现一次,是则返回当前字符,否则继续访问下一个字符。这
次遍历耗费的时间依然是O(N)。
代码
/**
* find the first unique char
* @param s
* @return
*/
public static int firstUniqChar (String s) {
HashMap<Character,Integer> count = new HashMap<>();
int n = s.length();
//build hash map : character and how often it appears
for (int i = 0; i < n; i++) {
char c = s.charAt(i);
count.put(c,count.getOrDefault(c,0) + 1);
}
//find the index
for (int i = 0; i < n; i++) {
if (count.get(s.charAt(i)) == 1) {
return i;
}
}
return -1;
}
复杂度分析
N为字符串的长度
- 时间复杂度:O(N)
- 空间复杂度:O(N)