[C++ code]无重复字符串最长字串(unordered_map)

开始力扣吧~

无重复字符串最长字串

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

让我捋一遍逻辑:

建立一个滑动窗口
设置左指针、右指针,两个指针中间的部分是窗口,左右指针最开始先指向最左侧
设置一个散列表存储窗口,key为s中的值,value为是否出现在窗口中的判断(1出现、0没出现)
设置记录最大长度的数

大循环
{
  右指针一次向右挪一位,判断新加入到窗口的数字是否在散列表中
  {
   不在的话,相应位置的value改为1,右指针向右挪一个位置;
   在的话,退出循环;
  }

  退出循环时说明右面走到底或者右键所指的值已经出现在窗口中了
  最大长度赋值为当前最大长度和(右-左)二者中的最大值

  出现重复后缩小窗口
  {
    左值往右挪,挪到与右值重复的值的右面一个位置
  }
}

写!!!!

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int left=0,right=0,maxL=0;
        //散列表
        unordered_map<int,int> odd; 
        //右指针不出界时
        while(right<s.size())
        {
            //右值不在散列表
            while(right<s.size()&& !odd[s[right]])
            {
                odd[s[right]]=1;
                ++right;
            }
            //最大长度
            maxL=max(maxL,right-left);
            //缩小窗口
            while(left<right)
            {
                odd[s[left]] = 0;
                if(s[left++]==s[right]){break;}//先left比较,后left值加1
            }
        }
        return maxL;

    }
};

补充:散列表unordered_map

unordered_map是key-value关联容器,直接根据key值查找对应的value,查询单个值的效率高,二者数据类型可以不同,key唯一但没有存储顺序

简单操作:定义、insert增加、find查找、erase删除、end终点

unordered_map<string, int> exampleMap;
exampleMap.insert("Ming", 1);
exampleMap.erase("Ming");
exampleMap.find(x) != exampleMap.end();

要是加入迭代器:

unordered_map的迭代器是一个指向此元素的指针,可以通过迭代器获取它的值。first、second等可以获取相对应位置的值

例如eMap<键,值>,则eMap.first为键,eMap.second为值

unordered_map<K,V>::iterator it_M;
(*it_M).first;             // 键K
(*it_M).second;            // 值V
(*it_M);                   // <键,值>对
//或写为
it_M->first;
it_M->second;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值