1. 程式人生 > >387. First Unique Character in a String(字串中的第一個唯一字元)-- c語言

387. First Unique Character in a String(字串中的第一個唯一字元)-- c語言

387First 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;//返回第一個唯一字元的下標
}