3.无重复字符串的最长子串

一、问题描述

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

二、问题简化

这个问题本质上是:

“从一个数组中,寻找最长的子串,其元素均不相同”。

这里说下子串和子序列的区别:子串是必须连续的,而子序列不一定连续,但它们的顺序是和原数组相同的。

字符串本质是字符的数组,所以我们使用模板使其更通用化比较恰当。

并且返回值仍然可以是多个

所以整个函数可以表示为:

template<typename T>
vector<T> GetSubLongest(const T& container)

三、功能实现

1.遍历整个序列,iter0记为下标。

2.从iter0遍历到结束作为子串,或提前出现了不同元素。

3.第2步中保存的子序列,与最长长度判断。如果更长,则删除旧元素,加入自己到结果。如果一样长就只加入自己到结果中。如果更短,iter0自增,进入下一个子串的开始。

template<typename T>
vector<T> GetSubLongest(const T& container)
{vector<T> ret;int max_size = 0;T sub;//如果比最大长度长,则加入返回值且更新最大长度auto fn_addSub = [&](){if (sub.size() > max_size){ret.clear();ret.push_back(sub);max_size = sub.size();}else if (sub.size() == max_size){ret.push_back(sub);}};for (auto iter0 = container.begin(); iter0 != container.end(); ++iter0){sub.clear();auto iter1 = iter0;sub.push_back(*iter0);while (true){++iter1;if (iter1 == container.end()){//判断加入,然后中断fn_addSub();break;}auto iter_f = find(sub.begin(), sub.end(), *iter1);if (iter_f == sub.end()){//如果不是重复元素,则添加到subsub.push_back(*iter1);}else{//重复了,则检测是否加入到返回值//判断加入,然后中断fn_addSub();break;}}}return ret;
}

四、测试结果

//输入值如下:"我爱中国,中国爱我!"
{ 1,1,2,5,3,2,2,7,8,8,9,1,0 }
"abcabcbb"
"pwwkew"

可以看到,不仅对字符串有用,还对数字有效,甚至于任何事物(只要它们可以比较是否相同),这就是模板泛型算法的魅力。

在判断子序列是否比以往的更长时,由于它会出现两次,所以我写成了lambda表达式。尽量防止代码重复出现,是我编程的原则之一。

还有我使用的是wstring字符串,而不是string。前者是utf-16编码,任何字符都只算一个。如果使用string,中文会算作两个,这样算法就不可能正确处理汉字的相同判断。在使用wcout输出时,需要设置一下本地化环境,调用wcout.imbue(locale("chs"));即可,但这还不是最通用化的写法,暂时这样吧。

完整的代码如下:

//3.无重复字符串的最长子串#include <iostream>
#include <string>
#include <list>
#include <vector>
using namespace std;template<typename T>
vector<T> GetSubLongest(const T& container)
{vector<T> ret;int max_size = 0;T sub;//如果比最大长度长,则加入返回值且更新最大长度auto fn_addSub = [&](){if (sub.size() > max_size){ret.clear();ret.push_back(sub);max_size = sub.size();}else if (sub.size() == max_size){ret.push_back(sub);}};for (auto iter0 = container.begin(); iter0 != container.end(); ++iter0){sub.clear();auto iter1 = iter0;sub.push_back(*iter0);while (true){++iter1;if (iter1 == container.end()){//判断加入,然后中断fn_addSub();break;}auto iter_f = find(sub.begin(), sub.end(), *iter1);if (iter_f == sub.end()){//如果不是重复元素,则添加到subsub.push_back(*iter1);}else{//重复了,则检测是否加入到返回值//判断加入,然后中断fn_addSub();break;}}}return ret;
}int main()
{wcout.imbue(locale("chs"));//0auto ret = GetSubLongest(wstring(L"我爱中国,中国爱我!"));for (auto& iter : ret){wcout << iter << endl;}wcout << endl;//1auto ret1 = GetSubLongest(list<int>({ 1,1,2,5,3,2,2,7,8,8,9,1,0 }));for (auto& iter : ret1){for (auto& iter1 : iter){wcout << iter1;}wcout << endl;}wcout << endl;//2auto ret2 = GetSubLongest(wstring(L"abcabcbb"));for (auto& iter : ret2){for (auto& iter1 : iter){wcout << iter1;}wcout << endl;}wcout << endl;//3auto ret3 = GetSubLongest(wstring(L"pwwkew"));for (auto& iter : ret3){for (auto& iter1 : iter){wcout << iter1;}wcout << endl;}wcout << endl;
}

【LeetCode】3.无重复字符串的最长子串相关推荐

  1. [贪心|字符串] leetcode 3 无重复字符的最长子串

    [贪心|字符串] leetcode 3 无重复字符的最长子串 1.题目 题目链接 给定一个字符串,请你找出其中不含有重复字符的最长子串的长度. 示例1: 输入: "abcabcbb" ...

  2. 【LeetCode】无重复字符的最长子串【滑动窗口法】

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc&qu ...

  3. LeetCode 3. 无重复字符的最长子串(滑动窗口+哈希)

    1. 题目 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 " ...

  4. [leetcode] 3.无重复字符的最长子串

    给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 " ...

  5. LeetCode 3:无重复字符的最长子串 思考分析

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc&qu ...

  6. LeetCode之无重复字符的最长子串

    1. 题目 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度.示例 1:输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "ab ...

  7. leetcode算法—无重复字符的最长子串 Longest Substring Without Repeating Characters

    关注微信公众号:CodingTechWork,一起学习进步. 题目 Longest Substring Without Repeating Characters: Given a string, fi ...

  8. 无重复字符串的最长子串 python

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc&qu ...

  9. LeetCode 3. 无重复字符的最长子串 (滑动窗口哈希表)

    3. 无重复字符的最长子串 题意: 找子串 子串中无重复字符 要求子串长度最长 解法1(暴力法) 思路: 建立一个长度不断变小的滑动窗口 用一个指针指针扫描窗口内的每个元素: 如果除去指针指向的那个元 ...

最新文章

  1. 第二十四课.循环神经网络RNN
  2. laravel artisan
  3. 3、excel数据格式设置快捷键
  4. 关于request.getServletPath(),request.getContextPath()的总结
  5. Android JSON 数据解析 之原生 API
  6. HDFS原理 | NameNode和DataNode工作原理(图形化通俗易懂)
  7. DirectShow源码下载
  8. Arduino 实现PWM输出背后的相关知识
  9. 《爱的五种能力》读书笔记
  10. 当win10电脑,本地网络出现了一个意外的情况,不能完成所有你在设置中所要求的更改?
  11. 【洛谷】P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布(详细代码)
  12. 单身职场人士怎么利用晚上时间提高自己?
  13. 什么是Arduino? 了解有关此开源电子平台的信息
  14. 浙大PTA-Python题库 编程题第一章(1-1~1-3)题解
  15. 字符串 substring()和 substr()之间的区别
  16. Android 字体 hsv 对比度,Android图像锐化,饱和度,色调,亮度和对比度
  17. cread and close
  18. 秘制牛肉Gamma阶段项目展示
  19. 排课系统asp源代码_自动排课系统 V1.1(源码)
  20. 百度绿萝算法打击友链交易

热门文章

  1. oracle 查询每组条数,Oracle SQL查询:根据时间检索每组的最新值
  2. 【机器学习算法专题(蓄力计划)】一、机器学习简史和常用算法的梳理
  3. 四、学编程语言前,不了解Git,怎么入坑
  4. tensorflow从入门到放弃(三)
  5. 别再无聊地吹捧了,一起来动手实现MAE玩玩吧!
  6. 贝叶斯神经网络对梯度攻击的鲁棒性
  7. 综述:基于GAN的图像翻译模型盘点
  8. 丑憨批的爬虫笔记6实例
  9. 牛客网 短最优升级路径 【Dijkstra算法】+【路径记录】
  10. 【教程】写CSDN博客时 调整图片大小,图片居中