字符串中的第一个唯一字符--LeetCode

字符串中的第一个唯一字符

题目(出自LeetCode)

  • 给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。

  • 示例:

    • s = "leetcode" 返回 0
    • s = "loveleetcode" 返回 2
  • 提示:你可以假定该字符串只包含小写字母。

解题

1.初步尝试,没看官方题解,自己琢磨

  • 题解
    • 先把字符串Str 转成字符数组
    • 构造一个LinkedHashSet存放不重复的字符、一个HashSet存放重复的字符
    • 遍历字符数组
      • if LinkedHashSet、HashSet中都不存在该字符,则存入LinkedHashSet
      • else if LinkedHashSet存在该字符,说明字符重复,移出LinkedHashSet,加入HashSet
    • 获取LinkedHash第一个不重复字符char,返回 Str.indexOf(char);若有执行return,则不会执行下一步了
    • 返回-1
  • 代码
    class Solution {
        public int firstUniqChar(String s) {
            char[] charArray = s.toCharArray();
            LinkedHashSet<Character> lhs = new LinkedHashSet<Character>();
            HashSet<Character> hs = new HashSet<Character>();
            for(char c : charArray){
                if(!hs.contains(c) && !lhs.contains(c)) lhs.add(c);
                else if(lhs.contains(c)){
                    lhs.remove(c);
                    hs.add(c);
                }
            }
            for(char c : lhs){
                return s.indexOf(c);
            }
            return -1;
        }
    }
    
  • 结果
    • 执行用时:22 ms, 在所有 Java 提交中击败了67.92%的用户
    • 内存消耗:38.8 MB, 在所有 Java 提交中击败了76.62%的用户

2.两次遍历(参考了大神数据结构和算法给出的题解)

  • 题解
    • 第一次遍历统计字符出现次数
    • 第二次从头开始遍历字符串,其出现次数为一则直接返回索引
    • 遍历完则返回-1
  • 代码
    class Solution {
        public int firstUniqChar(String s) {
            char[] charArray = s.toCharArray();
            int[] count = new int[26];
            for(char c : charArray){
                ++count[c-'a'];
            }
            for(int i=0; i<s.length(); ++i){
                if(count[charArray[i]-'a']==1) return i;
            }
            return -1;
        }
    }
    
  • 结果
    • 执行用时:5 ms, 在所有 Java 提交中击败了94.04%的用户
    • 内存消耗:39 MB, 在所有 Java 提交中击败了43.16%的用户

3.使用API[手动狗头][年轻人不讲武德!]

  • 题解
    • 遍历字符串,indexOf()和lastIndexOf()查出的索引是同一个的话,就说明它不重复,直接返回索引
  • 代码
    class Solution {
        public int firstUniqChar(String s) {
            for (int i = 0; i < s.length(); i++)
                if (s.indexOf(s.charAt(i)) == s.lastIndexOf(s.charAt(i)))
                    return i;
            return -1;
        }
    }
    
  • 结果
    • 执行用时:33 ms, 在所有 Java 提交中击败了48.62%的用户
    • 内存消耗:38.8 MB, 在所有 Java 提交中击败了77.72%的用户
posted @ 2021-05-26 11:52  金鱼同学  阅读(139)  评论(0编辑  收藏  举报