首页 > 其他分享 >《剑指Offer》-48-最长不含重复字符串的子字符串

《剑指Offer》-48-最长不含重复字符串的子字符串

时间:2023-08-11 09:23:36浏览次数:56  
标签:map 48 Offer int len maxLen 字符串 dp

这题以前做过,和 力扣-3 重复

	int lengthOfLongestSubstring(string s) {
		// 本来应该是用map,但是其实可以使用数组替代,下标对应了字母
		unordered_map<char, int> map;
		int len = s.size(),maxLen=0;// 初始化为0是因为可能字符串长度为0
		vector<int> dp(len+1, 0);// 多一个,0不用
		for (int i = 0; i < len; i++) {
			if (map.count(s[i])) {
				// 字母出现重复
				dp[i + 1] = i - map[s[i]];
			}
			else dp[i + 1] = dp[i] + 1;

			map[s[i]] = i;//更新索引
			maxLen = max(maxLen, dp[i + 1]);
		}
		return maxLen;
	}

因为字符不只是 小写字母,于是我将集合从数组改成了 map,但这仍然是错误的,关键是没有考虑到这种情况

"abba"

也就是当 当前字符与重复字符 之间的字符长度 > dp[i-1] 的时候,也就是说内部存在了重复段

为什么不需要考虑嵌套的情况?因为 dp 本身就是递归的,已经考虑过了

此时的dp[i]=dp[i-1]+1

	int lengthOfLongestSubstring(string s) {
		unordered_map<char, int> map;
		int len = s.size(), maxLen = 0;// 初始化为0是因为可能字符串长度为0
		vector<int> dp(len + 1, 0);// 多一个,0不用
		for (int i = 0; i < len; i++) {
			if (map.count(s[i])) {
				int distance = i - map[s[i]];
				// 如果距离 > 以上一个字符结尾的字符串中最长,说明包含了重复字符,+1
				// < 说明内部不包含重复字符
				// 相等是什么情况?比如 aa,此时应该是 1
				// 不需要考虑abccba,因为这种迭代根本就不会出现这种情况
				if (distance <= dp[i])dp[i + 1] = distance;
				else dp[i + 1] = dp[i] + 1;
			}
			else dp[i + 1] = dp[i] + 1;

			map[s[i]] = i;//更新索引
			maxLen = max(maxLen, dp[i + 1]);
		}
		return maxLen;
	}

第一次通过代码

优化

	int lengthOfLongestSubstring(string s) {
		unordered_map<char, int> map;
		int len = s.size(), maxLen = 0;// 初始化为0是因为可能字符串长度为0
		int pre = 0, prepre = 0;
		for (int i = 0; i < len; i++) {
			if (map.count(s[i]) && i - map[s[i]] <= prepre) pre = i - map[s[i]];
			else pre = prepre + 1;
			prepre = pre;

			map[s[i]] = i;//更新索引
			maxLen = max(maxLen, pre);
		}
		return maxLen;
	}

优化掉了一维数组以及优化了判断结构

标签:map,48,Offer,int,len,maxLen,字符串,dp
From: https://www.cnblogs.com/yaocy/p/17622182.html

相关文章

  • 剑指 Offer 12. 矩阵中的路径(中等)
    题目:classSolution{public:introw,col;booltraversal(vector<vector<char>>&board,stringword,inti,intj,intk){//传入棋盘,字符串,当前棋盘元素坐标,字符串索引if(i<0||i>=row||j<0||j>=col||board[i][j]!=word[k])retu......
  • 在Java中操作Redis_Spring Data Redis使用方式_操作字符串类型的数据
        ......
  • 【题解】Educational Codeforces Round 148(CF1832)
    A.NewPalindrome题目描述:给你一个由小写字母组成的回文字符串,问你是否能在重排其之后构造出另一个与原串不同的回文字符串。多测,\(t\le1000,2\le|s|\le50\)题目分析:考虑其实就是前\(\lfloor\frac{n}{2}\rfloor\)个位置存在两种或以上的不同字符,因为这样直接交换对......
  • CF1848F
    [CF1848F]VikaandWikishaber题没想出来,紫砂了。这种题的经典方法是考虑贡献,注意到顺着想贡献不容易我们倒过来想,设\(f_{i,j}\)表示\(i\)轮后\(j\)的大小,则\(f_{i,j}=\operatorname{xor}\limits_{k\in[0,i]}\binom{i}{k}\bmod2\\timesa_{(j+k)\bmodn}\)。然后......
  • 在线代码工具:根据十六进制字符串解析对应的字段值
    说明hexString是字节序是小端的(读值得时候会转为大端来读取值)valueByteSizes是个根据要求顺序读取值得字节大小的数组。例如:newbyte[]{4,2,1},程序会顺序读取hexString字符串:第一个值取4个字节并读取其值,第2个值取2个字节,第3个值取1个字节,4.(如果存在)第4个值取1个字节。......
  • 判断是不是子字符串
    1.题目链接:https://www.nowcoder.com/questionTerminal/5382ff24fbf34a858b15f93e2bd85307给定两个字符串s和t,判断s是否为t的子序列。你可以认为s和t中仅包含英文小写字母。字符串t可能会很长(长度n~=500,000),而s是个短字符串(长度<=100)。字符串的一个子序列是......
  • 字符串分割
    1.题目给定一个非空字符串S,其被N个‘-’分隔成N+1的子串,给定正整数K,要求除第一个子串外,其余的子串每K个字符组成新的子串,并用‘-’分隔。对于新组成的每一个子串,如果它含有的小写字母比大写字母多,则将这个子串的所有大写字母转换为小写字母;反之,如果它含有的大写字母比小写字母......
  • Go语言中字符串处理
    Go语言为字符串处理提供了丰富的功能。以下是处理字符串的一些常见方法和函数:基本操作:获取字符串长度:len(str)字符串连接:str1+str2访问特定字符(字节):str[index]字符串包(strings包):检查字符串是否包含子串:strings.Contains(str,substr)字符串比较:strings.Com......
  • C# 字符串
     字符串判断为空   if(a=="")最慢   if(a==string.Empty)其次   if(a.Length===)最快字符串拼接   +=最慢远远慢于其他三种   string.Format()慢   string.concat()其次   StringBuilder.Append()最快   ......
  • 《剑指Offer》-46-把数字翻译成字符串
    读题数字0~25分别对应了a~z一共26个字母现在给一个数字,比如12258,问可能对应多少种不同的翻译?比如:1,2,2,5,812,2,5,812,25,81,22,5,81,2,25,8一共5种思路使用动态规划的三要素:数组元素定义数组初始化状态转移方程1225有几种可能的翻译?1,2,2,51,22,51,2,2512,2,512,25也......