C++实现无重复字符的最长子串

目录
  • 题目及要求:
  • 提示:
  • 原创代码:
  • 代码思路:

题目及要求:

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

提示:

0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成

原创代码:

class Solution {
public:
    int lengthOfLongestSubstring(string s)
    {
        int begin=0;//每个当前子串的开头
        int end=0;//每个当前子串的末尾
        int value=0;//判断下一个字符是否属于当前子串
        int max=0;//记录历史字串的最大元素个数
        int now=0;//储存当前字串的元素个数
        string str;//代表当前字串
        if(s.size()==0)
        return 0;
        while(end<=(s.size()-1))
        {
            value=str.find(s[end],0);
            if(value!=-1)
            {
                str.erase(0,value+1);
                begin=end-(str.size()-value);
            }
            str.push_back(s[end]);
            now=str.size();
            max=now>max?now:max;
            end++;
        }
        return max;
    }
};

输出示例:
示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
示例 4:
输入: s = “”
输出: 0

代码思路:

首先:

定义变量

int begin=0;//每个当前子串的开头
int end=0;//每个当前子串的开头
int value=0;//判断下一个字符是否属于当前子串
int max=0;//记录历史字串的最大元素个数
int now=0;//储存当前字串的元素个数
string str;//代表当前字串

其次:
通过以下条件判断形参string s是否为空字符串

if(s.size()==0)
return 0;

再其次:
若形参string s不是空字符串,由于

int end=0;//每个当前子串的末尾

则用end来引入新元素,每判断一次新元素与当前子串的关系,则end++

最后:
若新元素与当前的关系表明新元素不与当前子串内的元素重复则直接将新元素加入子串,若新元素与当前的关系表明新元素与当前子串内的元素重复则将子串含有冲突元素的前半部分删除并将新元素加入到当前子串

反思所得:
在本次编程过程中我经常出现提示堆栈内存溢出的问题,之后发现是对形参string s是空字符串的情况没加以控制,在未来的编程中我会更加注意。
而且我还学会了利用条件运算符来记录记录历史字串的最大元素个数,即

max=now>max?now:max;

LeetCode链接:
https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/

到此这篇关于C++实现无重复字符的最长子串的文章就介绍到这了,更多相关C++ 无重复字符的最长子串内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2021-07-25

C++实现leetcode(3.最长无重复字符的子串)

[LeetCode] 3. Longest Substring Without Repeating Characters 最长无重复字符的子串 Given a string, find the length of the longest substring without repeating characters. Example 1: Input: "abcabcbb" Output: 3 Explanation: The answer is "abc", wit

Python3 无重复字符的最长子串的实现

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

python3实现字符串的全排列的方法(无重复字符)

最近在学一些基础的算法,发现我的数学功底太差劲了,特别是大学的这一部分,概率论.线性代数.高数等等,这些大学学的我是忘得一干二净(我当时学的时候也不见得真的懂),导致现在学习算法,非常的吃力.唉!不说了,补习中... 抛出问题 求任意一个字符串的全排列组合,例如a='123',输出 123,132,213,231,312,321.(暂时假定字符串没有重复) 解决方案 目前有两种解决的方法 方法一: def str_sort(s=''): if len(s) <= 1: return [s] st

用位图排序无重复数据集实例代码(C++版)

<Programming Pearls>(编程珠玑下载)第一章讲述了如何用位图排序无重复的数据集,整个思想很简洁,今天实践了下. 一.主要思想 位图排序的思想就是在内存中申请一块连续的空间作为位图,初始时将位图的每一位都置为0,然后依次读取待排序文件的整数,将整数所在的位设置为1,最后扫描位图,如果某一位为1,则说明这个数存在,输出到已排序文件.比如待排序的数据S={3,0,4,1,7,2,5},max(S)=7,我们可以设置一个八位的位图B,将位图的每一位初始为0,即B=[0,0,0,0,0

.net中string无重复数字的实现方法

复制代码 代码如下: //string strText = "1334677999";实现无重复        public static string qu(string lab)        {            string strResult = string.Empty;            for (int intIdx = 0; intIdx < lab.Length; intIdx++)            {                if (st

匹配5到10位无重复数字的正则表达式

对于有重复的5到10位数字可以使用\d{5,10} 这样的正则 无重复的5到10位数字我考虑了一下还不会,最然只好查网上. 有一个版本还不错,反正RegexBuddy测试通过了. 复制代码 代码如下: ^(?!\d*?(\d)\d*?\1)\d{5,10}$ 对于(?!---(--)---\1)这样的形式我还没有研究透,有时间我真要细细研究. 上一个php的例子: 复制代码 代码如下: <?php $str = '123456789'; $search = '/^(?!\d*?(\d)\d*?\

asp.net 无重复随机数代码

复制代码 代码如下: /// <summary> /// 产生无重复随机数 /// </summary> /// <param name="num">个数</param> /// <param name="minValue">最小数</param> /// <param name="maxValue">最大数</param> /// <retur

可用的ASP无重复数字随机函数, 数组实现, 并应用于随机显示记录集

经我们站长测试可用的ASP无重复数字随机函数, 数组实现, 并应用于随机显示记录集作用: 本函数适用于随机显示小数量的随机不重复数字 本函数适用于显示小数量的随机不重复记录集 为了不影响效率, 上限超过一千, 不建议使用本函数 shawl.qiu 2006-09-06  http://blog.csdn.net/btbtd 主内容: 函数及应用函数随机显示100条记录 linenum  复制代码 代码如下: <%       dim rs, rNum       dim temp       s

Java 1,2,3,4能组成多少个互不相同且无重复数字的实现代码

题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. 程序设计: public class Wanshu { public static void main(String[] args) { int i=0; int j=0; int k=0; int t=0; for(i=1;i<=4;i++) for(j=1;j<=4;j++) for(k=1;k<=4

Java 中实现随机无重复数字的方法

一般有点开发经验的朋友都能实现这样的功能,只不过是效率上的问题.我们一般在面对这样的问题时,总会平铺直序的联想到,先生成一个数组,然后在一个循环中向数组中添加随机数字,在添加数字的过程中先查找一下数组中是否存在这个数字,如果不存在这个数字就直接添加到数组中:如果存在这个数字就不添 加.我们一般都是这样考虑问题的,这样考虑也能实现功能,我刚才也说了,只不过是效率上的问题. 为了更好地理解这个题意,我们先来看下具体内容:生成一个1-100 的随机数组,但数组中的数字不能重复,即位置是随机的,但数组元

Python输出由1,2,3,4组成的互不相同且无重复的三位数

题目:有四个数字:1.2.3.4,能组成多少个互不相同且无重复数字的三位数?各是多少? 程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. 程序源代码 方法1: #!/usr/bin/python # -*- coding: UTF-8 -*- for i in range(1,5): for j in range(1,5): for k in range(1,5): if( i != k ) and (i != j) and (j != k):