choupiaoyi 2020-04-09
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
案例:
s = "leetcode"
返回 0.
s = "loveleetcode",
返回 2.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/first-unique-character-in-a-string
这道题最优的解法就是线性复杂度了,为了保证每个元素是唯一的,至少得把每个字符都遍历一遍。
算法的思路就是遍历一遍字符串,然后把字符串中每个字符出现的次数保存在一个散列表中。这个过程的时间复杂度为 O(N)O(N),其中 NN 为字符串的长度。
接下来需要再遍历一次字符串,这一次利用散列表来检查遍历的每个字符是不是唯一的。如果当前字符唯一,直接返回当前下标就可以了。第二次遍历的时间复杂度也是 O(N)O(N)。
#include <stdio.h> #include <stdlib.h> int firstUniqChar(char * s); int main() { int dex; char * str = (char *)malloc(sizeof(char)*1000); gets(str); dex =firstUniqChar(str); printf("%d",dex); } int firstUniqChar(char * s) { int i,j,len,dex; len =strlen(s); if(len==0) return -1; if(len==1) return 0; int nums[26]={0}; for(i=0;i<len;i++) { dex =s[i]-‘a‘; ++nums[dex]; } //遍历找出个数为1的第一个字符 for(i=0;i<len;i++) { dex=s[i]-‘a‘; if(nums[dex]==1) return i ; } return -1 ; }