lintcode

646. 第一个独特字符位置

2017-11-20  本文已影响17人  和蔼的zhxing

给出一个字符串。找到字符串中第一个不重复的字符然后返回它的下标。如果不存在这样的字符,返回 -1。
样例
给出字符串 s = "lintcode",返回 0。
给出字符串 s = "lovelintcode",返回 2。
1.最容易想到的一个思路,双层遍历,对于每一个字符,遍历整个字符串,如果能找到相同的(且不能是当前字符串),则不合要求,直接跳出内层循环检查下一个,只要找到第一个单独的,没有重复的,则可以返回索引,要注意一种情况是不存在这样的字符怎么呢,那就是遍历了所有的字符都没有找到这样一个字符,我们同样返回-1.

int firstUniqChar(string &s) {
       if(s.empty())
       return -1;
      int num=0;
       for(size_t i=0;i<s.size();i++)   //对每个字符都遍历所有字符
       {
           for(size_t j=0;j<s.size();j++)   
           {
               if(s[j]==s[i]&&i!=j) 
               //如果有相等的,而且不是本字符,那么说明有相同的,考察下一个字符
               {   num++;
                   break;
                   
               }
               if(j==s.size()-1)   //遍历到最后一个也没有找到,那说明这个就是符合要求的,返回
               {return i;
               }
           }
       }
       if(num=s.size())   //如果字母都找过了也没有,则返回-1
         return -1;
        // write your code here
    }

2.另一种思路一开始想的是可以把每个字符放在一个哈希表中,但这个要求hash_map是按照插入顺序的,但是c++STL中给出的无序版本的map也并非是按照插入的顺序来的,所以这种方法用hash_map是不好做了,当然我可以用vector<pair<char,int>>来做,find函数,正好可以返回vector的迭代器。这种的复杂度并不比上面想的那个要小,所以也不写了。

上一篇 下一篇

猜你喜欢

热点阅读