leetcode刷题387 字符串中的第一个唯一字符 First Unique Character in a String(简单) Python Java

题目大意:

给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -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.	}  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值