哈希表解决字符串问题

题目5:无重复字符的最长子串

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

 方法一:

//思路:控制区间的所有元素没有重复,使用哈希表来判断。每次重复的时候清空
//哈希表
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        
        int len = s.size();
        int hashmap[256] = {0};
        int flag = 0;
        int current = 0;
        int result = current;
        int i=0;
        for(i=0;i<len;i++)
        {
            if(hashmap[s[i]] != 0)
            {
                //这个子串有重复
                current = i-flag;
                if (result < current)
                    result = current;
                //清除哈希表
                for(;flag<i;flag++)
                {
                    if(s[flag]!=s[i])
                        hashmap[s[flag]] = 0;
                    else
                        break;
                }
                hashmap[s[i]] = 1;
                flag++;
            }
            else{
                hashmap[s[i]] = 1;//置0
            }
        }
        //处理没有重复的情况。
        current = i-flag;
        if (result < current)
            result = current;

        return result;
    }
};

方法二:

//方法二:滑动窗口 就是我的方法的进阶。使用hash表来存储字符串上次出现的位置
int lengthOfLongestSubstring(string s) {
        vector<int> hash(256,-1);
        int left = -1;
        int ans = 0;
        for(int i=0;i<s.size();++i){
            if(hash[s[i]] > left){
                left = hash[s[i]];
            }
            ans = max(ans,i-left);
            hash[s[i]] = i;
        }
        return ans;
    }

题目387 

字符串中的第一个唯一字符

给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。

案例:

s = "leetcode"

返回 0.

s = "loveleetcode",
返回 2.

题解:

 题解,使用hash表对字符出现的个数进行统计,之后再次遍历字符串查找hash表即可。注意出现次数问题的都可以用这个思路来求解!

// @lc code=start
class Solution {
public:
    int firstUniqChar(string s) {
        int len = s.size();
        int result = 0;
        int hashmap[256] = {0};
        for(int i=0;i<len;i++)
        {
            hashmap[s[i]]++;
        }
        for(int i=0;i<len;i++)
        {
            if(hashmap[s[i]]==1)
                return i;
        }
        return -1;

    }
};//不要遍历哈希表,再遍历一次字符串就好!!!

猜你喜欢

转载自www.cnblogs.com/SK1997/p/11964360.html