387. First Unique Character in a String(字串中的第一個唯一字元)-- c語言
阿新 • • 發佈:2019-02-01
387. First Unique Character in a String(字串中的第一個唯一字元)-- c語言
Given a string, find the first non-repeating character in it and return it's index. If it doesn't exist, return -1.
Examples:
s = "leetcode" return 0. s = "loveleetcode", return 2.
Note: You may assume the string contain only lowercase letters.
解題方法1: |
---|
首先考慮特殊情況。遍歷兩次:第一次定點,第二次判定 |
執行時間 16ms int firstUniqChar(char* s) { int length = strlen(s); if(length == 1) { return 0; } for(int i=0;i<length;i++)// { for(int j = 0; j < length; j++) { if( i != j) //排除自己和自己比較的情況 { if(s[i]-s[j] == 0) //兩者相等,則此字元不可能是唯一字元,跳出迴圈,判定下一個 { break; } else { if(j+1 >= length)//如果j掃描完,則找到解 { return i;//返回下標 } if(i == length-1) //如果i指向最後一個字元 { if(j+2 >= length)//當j指向倒數第二個字元時,說明找到解 { return i; } } } } } } return -1;//沒找到解,返回-1 }
改進: |
---|
通過定義一個標誌位標誌當前字元是否是唯一字元 |
執行時間 16ms int firstUniqChar(char* s) { int len=strlen(s); if(len==1)//特殊情況優先考慮 return 0; if(len==0) return -1; int flag=0;//標誌s[i]是不是唯一字元 for(int i=0;i<len;i++) { flag=0;//每次都初始化 for(int j=0;j<len;j++) if(s[i]==s[j]&&i!=j) { flag=1; break; } if(flag==0)//s[i]是唯一字元且是第一個 return i; } return -1; }
解題方法2: |
---|
通過定義額外的陣列來記錄個字母的個數,並通過陣列來得到解 |
執行時間 8ms
int firstUniqChar(char* s) {
if(!s) {//特殊情況優先考慮
return -1;
}
int a[2][26];
for(int i =0;i<26;i++) {
a[0][i] = 0;//儲存字元在字串中的個數
a[1][i] = -1;//儲存字元在字串中的下標
}
int len = strlen(s);
int i = 0;
for(;i<len;i++) {
int t = s[i] - 'a';
a[0][t] += 1;
if(a[1][t] == -1) {
a[1][t] = i;
}
}
i = 0;
int r = -1;//記錄第一個唯一字元的下標
for(;i<26;i++) {
if(a[0][i] == 1) {
if(r == -1) {//將第一次出現a[0][i] = 1字元的下標記錄
r = a[1][i];
} else if(a[1][i] < r){//通過比較尋找第一個唯一字元
r = a[1][i];
}
}
}
return r;//返回第一個唯一字元的下標
}