Leetcode題解之字串(3)字串中的第一個唯一字元
阿新 • • 發佈:2018-12-21
題目描述:
給定一個字串,找到它的第一個不重複的字元,並返回它的索引。如果不存在,則返回 -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; } }