1. 程式人生 > >Leetcode題解之字串(3)字串中的第一個唯一字元

Leetcode題解之字串(3)字串中的第一個唯一字元

題目描述:

給定一個字串,找到它的第一個不重複的字元,並返回它的索引。如果不存在,則返回 -1。

案例:

s = "leetcode"
返回 0.

s = "loveleetcode",
返回 2.

注意事項:您可以假定該字串只包含小寫字母。

思路:第一種思路,自己硬想的 ,時間複雜度O(n^2)......好爛。思路看程式碼。

class Solution {
    public int firstUniqChar(String s) {
        int len = s.length();
        boolean[] flag=new boolean[len];  
        int x=-1;
        char[] ch = new char[len];
        //如果字串長度為1。那就返回0
        if(len==1){   
                    x=0;
                    return x;
         }
        //把字串變 字元型陣列...天啊我只會這招?
        for(int i=0; i<ch.length; i++){
            ch[i]=s.charAt(i);
        }
        for(int j=0; j<ch.length; j++){
            for(int k=0;k<ch.length;k++){
                //遇到自己就不改變標記  
                if(j==k)
                {
                    flag[j] = false;
                }else if(ch[j]==ch[k]){
                    flag[j] = true; //遇到別人看看是否有相同的,有一個就該標記跳出。
                    break;
                }
             }
        }
        //從前面開始查標記。如果有立刻 將該索引給傳出。
        for(int l=0; l<flag.length;l++){
            if(flag[l]==false){
                x=l;
                return x;
            }
            
        }
        //沒有不重複,返回-1
        return x;
    }
}

第二種看leetcode大神們的:由於字串只為小寫的26個字母(我都沒注意這個條件)

利用for迴圈將字串每個字母的索引都獲得了,如果indexOf 返回值為 -1 .表示沒有找到該字母。

如果從前面開始找到的 索引 等於從後面開始找的索引。index== s.lastindexOf()  。說明只有一個字母。

res = -1 是初始值。如果沒有返回-1

第一次進入迴圈。如果 由判斷語句,把剛獲得的index 付給res;

之後每次迴圈都會比較 索引大小。最後必然取得是最小的。

時間複雜度為O(n)............

class Solution {
    public int firstUniqChar(String s) {
        int res = -1;
        
        for(char ch='a'; ch<='z'; ch++) {
            int index = s.indexOf(ch);
            if(index != -1 && index == s.lastIndexOf(ch)) {
                res = res == -1?index:Math.min(res, index);
            }
        }
        
        return res;
    }
}