LeetCode 387. First Unique Character in a String(字符串中的第一个唯一字符) -- c语言

387First Unique Character in a String

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)//如果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]是不是唯一字符,0是1不是
    for(int i=0;i

解题方法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

改进:

/*
执行用时 : 12 ms, 在First Unique Character in a String的C提交中击败了98.86% 的用户
内存消耗 : 8.4 MB, 在First Unique Character in a String的C提交中击败了78.39% 的用户
*/
int firstUniqChar(char* s) {
    int length = strlen(s);

    int str[26]={0};
    /*
    int *str = (int *)malloc(26*sizeof(int));//记录26个字母出现的次数
    memset(str,0,26*4);//初始化数组为0
    此两条语句可以代替int str[26]={0};语句。但会增加执行用时,再此是为了了解这种方法
    */

    int i = 0;
    //计算各个字符出现的次数
    for(i=0;i

后记:

  1. 推荐两种改进算法,另两种是自己第一次做的,可以做为对比,总结出思考的缺陷,下次考虑更周全
  2. 注意memset()函数的使用

你可能感兴趣的:(LeetCode,C语言,算法,字符串)