第一个只出现一次的字符

本贴最后更新于 2500 天前,其中的信息可能已经天翻地覆

题目描述

在一个字符串(1<=字符串长度 <=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置

解题思路

两种方法:

  • 利用两个链表或者一个 map;

  • 因为全部由字母组成,可以利用一个大小为 52 的数组记录字符的出现情况(为了拓展性,这里用了大小为 256 的数组):

    • 数组初始化为-1;

    • 如果数组第一次出现,则利用字符的 ASCII 大小作为数组的 index,数组相应位置的值设置为字符在字符串的位置;

    • 如果数组内相应位置不为-1,说明字符已经出现过,把数组相应位置设为-2;

    • 最后再遍历一遍数组,找到非负数的最小值,就是所求的位置。

代码

代码一:

import java.util.HashMap;
public class Solution {
    public int FirstNotRepeatingChar(String str) {
        if (str == null || str.trim().length() == 0)
            return -1;
        HashMap<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < str.length(); i++) {
            if (map.containsKey(str.charAt(i)))
                map.put(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;
    }
}

代码二:

public class Solution {
    public int FirstNotRepeatingChar(String str) {
        if (str == null || str.length() == 0)
            return -1;
        int[] tmp = new int[256];
        for (int i = 0; i < 256; i++) {
            tmp[i] = -1;
        }
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            if (tmp[c] == -1)
                tmp[c] = i;
            else if (tmp[c] > -1)
                tmp[c] = -2;
        }
        int ret = Integer.MAX_VALUE;
        for (int i = 0; i < 256; i++) {
            if (tmp[i] > -1)
                ret = ret < tmp[i] ? ret : tmp[i];
        }
        return ret;
    }
}

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...