CP3 无重复字符的最长子串

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

学习:

用unordered_map暴力破解,unordered_set 容器,不再以键值对的形式存储数据,而是直接存储数据的值 ;容器内部存储的各个元素的值都互不相等,且不能被修改;不会对内部存储的数据进行排序。empty(),find(),insert(),count(),erase()

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int result=0;
        for(int i=0;i<s.length();i++)
        {
            unordered_set<char> st;
            int temp=0;
            for(int j=i;j<s.length();j++)
            {
                if(st.count(s[j])==0)
                {
                    st.insert(s[j]);
                    temp++;
                }
                else
                {
                    break;
                }
            }
            if(temp>result)
            {
                result=temp;
            }
         }
        return result;
    }
};

答案给的题解也差不多,用滑动窗口来做的,结合两个指针,其实和我的也差不多(或许

评论1:答案有个缺点,左指针并不需要依次递增,即多了很多无谓的循环。 发现有重复字符时,可以直接把左指针移动到第一个重复字符的下一个位置即可。评论2:标准答案步骤稍多,而且不容易理解,应该左侧指针固定,移动右侧指针,当窗口内最右侧的字符在set中存在时,左侧指针移动并从set中移除原左侧指针对应的字符,这样再取窗口长度的最大值即可。

很有道理,比我每次都定义一个set要好多了,按照这个想法自己去写了下,就是判断右指针与当前集合中的元素是否有重,如果有重则需要把当前左指针的元素移出,一直到没有重复为止。例如abcdcefghi,当左指针在a有指针在第二个c处,判断有重,会将左指针所只的a移出,依然有重,则b移出,c移出,后没有重复则可将右指针的加入,以此实现滑动窗口。

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int result=0;
        unordered_set<char> st;//唯一集合
        int left=0;int right=0;//左右指针

        for(;right<s.length();right++)
        {
            while(st.count(s[right])==1)
            {
                st.erase(s[left]);
                left++;
            }
            st.insert(s[right]);
            int temp=right-left+1;
            if(temp>result)
            {
                result=temp;
            }
         }
        return result;
    }
};

unordered_set,以下代码输出为2,所以没有重复

#include<iostream>
#include<unordered_set>
using namespace std;

int main()
{
	unordered_set<int> s;
	
	s.insert(4);
	s.insert(3);
	s.insert(3);
	cout<<s.size()<<endl;
	
	system("pause");
	return 0;
}

顺便看看了unordered_map,输出为4,所以不让我们加捏

#include<iostream>
#include<unordered_map>
using namespace std;

int main()
{
	unordered_map<char,int> p;
	p.insert(pair<char,int>('u',4));
	p.insert(pair<char,int>('u',3));
	cout<<p['u']<<endl;
	system("pause");
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值