剑指offer50a 第一个只出现一次的字符

暴力解法,O(n^2)。

另一个思路是HashMap,也比较简单。O(n)+O(n)。

import java.util.HashMap;

public class Solution {
    public int FirstNotRepeatingChar(String str) {
        if(str==null||str.length()<1) return -1;
        HashMap<Character,Integer> map = new HashMap<>();
        for(int i=0;i<str.length();i++){
            if(map.containsKey(str.charAt(i))) map.replace(str.charAt(i),map.get(str.charAt(i))+1);
            else map.put(str.charAt(i),1);
        }
        for(int i=0;i<str.length();i++){
            if(map.get(str.charAt(i))==1) return i;
        }
        return -1;
    }
}

运行时间:31ms

占用内存:9472k

这一题虽然简单,但是衍生出来的几道题也都是很有质量的:

-两个字符串A和B,删除A中出现在B中的字符。

-删除某字符串中所有重复的字符,如goolge->gole。

-判断两个单词是不是互为变位词。

# -*- coding:utf-8 -*-
class Solution:
    def FirstNotRepeatingChar(self, s):
        # write code here
        if s is None or len(s)<1:
            return -1
        dic = {}
        for c in s:
            if c in dic.keys():
                dic[c]+=1
            else:
                dic[c]=1
        for i,c in enumerate(s):
            if dic[c]==1:
                return i 
        return -1

运行时间:37ms

占用内存:5848k

posted @ 2019-02-28 20:29  大胖子球花  阅读(79)  评论(0)    收藏  举报