题目大意:
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
案例:
s = "leetcode"
返回 0.
s = "loveleetcode",
返回 2.
注意事项:您可以假定该字符串只包含小写字母。
class Solution(object):
def firstUniqChar(self, s):
"""
:type s: str
:rtype: int
"""
dic = {}
for i in s:
if i not in dic: # 如果s中的字符是第一次出现,则标记为1
dic[i] = 1
else:
dic[i] = dic[i] + 1 # 否则继续遍历
for i in range(len(s)):
if dic[s[i]] == 1:
return i
return -1
以下是Java版本:
题意:找到字符串中第一个不重复出现的字母,返回其在字符串中的位置。题目已经给出条件:输入的字符全部是小写,所以大小写区分这些问题就不用考虑了。
思路:利用s.lastIndexOf(i)进行判断是否重复,然后比较索引大小
1. public class Solution {
2. public int firstUniqChar(String s) {
3.
4. int retIndex = Integer.MAX_VALUE;
5. int pos;
6. for(int i = 97; i < 123; i++){
7.
8. pos = s.indexOf(i);
9. if(pos != -1 && pos == s.lastIndexOf(i)){
10. retIndex = pos < retIndex ? pos : retIndex;
11. }
12. }
13. if(retIndex != Integer.MAX_VALUE)
14. return retIndex;
15. return -1;
16. }
17. }
用数组就会快很多很多
1. class Solution {
2. public int firstUniqChar(String s) {
3. int[] arr = new int[27];
4. for (int i = 0;i < s.length() ;i++ )
5. arr[s.charAt(i) - 'a'] ++;
6. for (int i = 0;i< s.length() ;i++ )
7. if(arr[s.charAt(i) - 'a'] == 1) return i;
8. return -1;
9. }
10. }//28ms
HashMap解法
1. public class Solution {
2. public int firstUniqChar(String s) {
3. Map<Character, Integer> charMap = new HashMap<Character, Integer>();
4. for (int i = 0; i < s.length(); i++) {
5. char curChar = s.charAt(i);
6. if (charMap.containsKey(curChar)) {
7. charMap.put(curChar, charMap.get(curChar) + 1);
8. }
9. else {
10.
11. charMap.put(curChar, 1);
12. }
13.
14. }
15. for (int i = 0; i < s.length(); i++) {
16. char curChar = s.charAt(i);
17. if (charMap.get(curChar) == 1) {
18. return i;
19. }
20. }
21. return -1;
22. }
23. }