剑指offer: 字符串中第一个只出现一次的字符

题目描述:

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

基本的解题思路都是使用Hash结构或者是类似于Hash结构来辅助解题。
A、遍历一遍字符串,并记录下每一个字符出现的次数,然后再遍历一遍,找到字符只出现一次的位置,返回即可。
B、遍历一遍字符串,在遍历的过程中,Hash结构保存的不再是当前字符出现的次数,而是该字符出现的第一个位置,如果之后的字符串中再次出现了该字符,那么就把该字符对应的位置设置为-1;接下来就是遍历一遍Hash结构,找到位置信息大于等于0且最小的那个即可。

A思路Java代码实现:

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
public class Solution {
    public int FirstNotRepeatingChar(String str) {
        if (str == null || str.length() == 0) {
            return -1;
        }
        Map map = new HashMap();
        for (int i = 0; i < str.length(); i++) {
            if (map.get(str.charAt(i)) == null) {
                map.put(str.charAt(i), 1);
            } else {
                int val = map.get(str.charAt(i));
                map.put(str.charAt(i), ++val);
            }
        }
        for (int i = 0; i < str.length(); i++) {
            if (map.get(str.charAt(i)) == 1) {
                return i;
            }
        }
        return -1;
    }
}

B思路Java代码实现:

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
public class Solution {
    public int FirstNotRepeatingChar(String str) {
        if (str == null || str.length() == 0) {
            return -1;
        }
        Map map = new HashMap();
        int minIndex = 10000;
        for (int i = 0; i < str.length(); i++) {
            if (map.get(str.charAt(i)) == null) {
                map.put(str.charAt(i), i);
            } else {
                map.put(str.charAt(i), -1);
            }
        }
        // 遍历Hash结构而不是字符串
        for (char key : map.keySet()) {
            if (map.get(key) >= 0 && map.get(key) < minIndex) {
                minIndex = map.get(key);
            }
        }
        return minIndex;
    }
}

你可能感兴趣的:(offer刷题,剑指offer)