LeetCode-探索-初级算法-字符串-3. 字符串中的第一个唯一字符(个人做题记录,不是习题讲解)

50 篇文章 0 订阅
50 篇文章 0 订阅
LeetCode-探索-初级算法-字符串-3. 字符串中的第一个唯一字符(个人做题记录,不是习题讲解)

LeetCode探索-初级算法:https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/

  1. 字符串中的第一个唯一字符
  • 语言:java

  • 思路:用数组1存储26字母出现次数,然后用数组2记录26字母出现次数为1的字母,然后查找在字符串中下标最小的一个。如果len<=1分别返回-1和0,而不用进行计算

  • 代码(18ms):

    class Solution {
        public int firstUniqChar(String s) {
            int len = s.length();
            if(len==0)
                return -1;
            else if(len==1)
                return 0;
            else{
                char tc;
                int[] arr = new int[26];
                int[] res = new int[26];
                int index = 0;
                for(int i = 0; i < len; ++i){
                    tc = s.charAt(i);
                    arr[tc-97] += 1;
                }
                for(int i = 0;i<26;++i){
                    if(arr[i]==1)
                        res[index++] = i;
                }
                if(index>0){
                    int min = s.indexOf(""+(char)(res[0]+97));
                    for(int i = 1; i < index; ++i){
                        int j = s.indexOf(""+(char)(res[i]+97));
                        if(j<min)
                            min = j;
                    }
                    return min;
                }
                return -1;
            }
        }
    }
    
  • 参考代码(1ms):转换思维,找到第一个唯一字符,即从头找和从尾找都是自己。循环使用字符作为条件,而不是直接遍历整个数组

    class Solution {
          public int firstUniqChar(String s) {
            int index = s.length();
    		for (char k = 'a'; k <= 'z'; k++) {
    			int p1 = s.indexOf(k);// -1 不存在
    			int p2 = s.lastIndexOf(k);
    			if (p1 == p2 && p1 != -1) {
    				index = Math.min(index, p1);
    			}
    		}
    		if (index == s.length()) {
    			return -1;
    		}
    		return index;
        }
    }
    
    /*巧用阿斯克码连续,直接去找每一个字母的位置
    */
    
  • 参考后重写(1ms):

    class Solution {
        public int firstUniqChar(String s) {
            int len = s.length();
            int res = len;
            int head = -1;
            int tail = -1;
            for(char letter = 'a'; letter <= 'z'; ++letter){
                head = s.indexOf(letter);
                tail = s.lastIndexOf(letter);
                if(head==tail&&head!=-1)
                    res = Math.min(res,head);
            }
            if(res==len)
                return -1;
            return res;
        }
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值