zoukankan      html  css  js  c++  java
  • 【剑指Offer】34、第一个只出现一次的字符

      题目描述:

      在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写)。

      解题思路:

      对于本题,这里给出以下三种解法:(1)用 HashMap 建立每个字符与其出现次数的映射,然后再依次遍历字符串时,找到第一个出现次数为1的字符,返回其位置即可。(2)更进一步,因为该字符串全部是字母,所以可以用一个数组代替哈希表,数组下标就代表该字母。(3)使用模式匹配从前(indexOf)和从后(lastIndexOf)匹配每一个字符,相等即为唯一。

      编程实现(Java):

        //方法一:哈希表
        public int FirstNotRepeatingChar(String s) {
            Map<Character,Integer> map = new HashMap<Character,Integer>();
            for(int i=0;i<s.length();i++){
                char c=s.charAt(i);
                map.put(c,map.getOrDefault(c,0)+1);
            }
            for(int i=0;i<s.length();i++)
                if(map.get(s.charAt(i))==1)
                     return i;
            return -1;
        }
    
        //方法二:数组代替哈希表
        public int FirstNotRepeatingChar(String str) {
            if(str==null || str.length()==0)
                return -1;
            // A-Z对应的ASCII码为65-90,a-z对应的ASCII码值为97-122
            int len=str.length();
            int[] count=new int[58]; //122-65+1
            for(int i=0;i<len;i++){
                char c=str.charAt(i);
                count[c-'A']++;
            }
            for(int i=0;i<len;i++){
                char c=str.charAt(i);
                if(count[c-'A']==1)
                    return i;
            }
            return -1;
        }
    
        //方法三:模式匹配
        public int firstUniqChar(String s) {
            for(int i=0;i<s.length();i++){
                char c=s.charAt(i);
                if(s.indexOf(c)==s.lastIndexOf(c))
                    return i;
            }
            return -1;
        }
    
  • 相关阅读:
    HDU-5818-Joint Stacks
    蓝桥杯-2016CC-卡片换位
    HDU-2255-奔小康赚大钱(KM算法)
    蓝桥杯-PREV31-小朋友排队
    crypto.js加密传输
    js之对象
    LigerUi之ligerMenu 右键菜单
    关于js中window.location.href,location.href,parent.location.href,top.location.href的用法
    设置js的ctx
    AngularJS简单例子
  • 原文地址:https://www.cnblogs.com/gzshan/p/10824435.html
Copyright © 2011-2022 走看看