题解 | #最长不含重复字符的子字符串# 小白思路版

最长不含重复字符的子字符串

https://www.nowcoder.com/practice/48d2ff79b8564c40a50fa79f9d5fa9c7

//本题用动态规划求解,第一次完完全全按照自己思路实现,记录一下

//  dp【n】设为以字符串第n个元素结尾的最长的子字符串
//  本题用hashMap<Character,Integer> 记录暂存的子字符串
//  dp[n]的求解思路  循环遍历字符串  

// 细分为 三种情况:

//一.当 第i个字符等于 第i-1 个字符时 --前面的字符串已经不能达到题目所给的要求,所以直接清除,长度置为1

//二、 当 第i个字符 不 等于 第i-1 个字符时,且map中不含该字符时,说明该字符在当前子字符串中无重复,直接加一
//方程:dp【i】 = dp【i-1】 + 1

//三、 当 第i个字符 不 等于 第i-1 个字符时,map中有该字符,即包含第i-1个字符的子字符串中 含有第i个元素
// 方程:dp【i】 = i- map.get(s.charAt(i));
//注意:以第i个字符结尾的情况中,可能以第i-1个字符结尾的子字符串也可能重复
//这个时候 方程: dp【i】应为 dp【i-1】 + 1
//综合两种情况,取最小值 ,因为小范围不成立大范围不可能成立


//状态转移方程代码如下:

import java.util.*;

public class Solution {
  
    public int lengthOfLongestSubstring(String s) {

        if (s.length() < 1){
            return 0;
        }else if (s.length() ==1){
            return 1;
        }
	  
	//  dp【n】设为以字符串第n个元素结尾的最长的子字符串
        int[] dp = new int[s.length()];
	  
	 //初始化
        dp[0] = 1;
	  
	 //暂存最大值dp【i】
        int temp = 0;
        int ans = 0;

	//hashMap<Character,Integer> 记录暂存的子字符串
        Map<Character,Integer> map  = new HashMap<>();
	  
	//初始化
        map.put(s.charAt(0),0);
        for (int i = 1; i < s.length(); i++) { //遍历字符串
		  
	//当 第i个字符等于 第i-1 个字符时 前面的字符串已经不能达到题目所给的要求,所以直接清除,长度置为1
	//然后以该字符开始新的子字符串
            if (s.charAt(i) == s.charAt(i-1)){ 
                map.clear();
                dp[i] = 1;
                map.put(s.charAt(i),i);
            }
		  
            else{
			  
	//当map中不含该字符时,说明该字符在当前子字符串中无重复,直接加一
	// dp【i】 = dp【i-1】 + 1
                if (!map.containsKey(s.charAt(i))) {
                    dp[i] = dp[i - 1] + 1;
                    map.put(s.charAt(i),i);
                }
			  
	//还有一种情况是map中有该字符,包含第i-1个字符的子字符串中含有第i个元素
	//dp【i】 = i- map.get(s.charAt(i));
	//注意:以第i个字符结尾的情况中,可能以第i-1个字符结尾的子字符串也可能重复
	//这个时候dp【i】应为 dp【i-1】 + 1
	//综合两种情况,取最小值
                else {
                    dp[i] = Math.min(i - map.get(s.charAt(i)),dp[i-1] + 1)  ;
                    map.replace(s.charAt(i),i);
                }
            }
            if (dp[i] > temp){
                temp = dp[i];
            }
        }

        ans = temp;
        return ans;
    }
}

动态规划题解 文章被收录于专栏

个人动态规划题解合集

全部评论
大佬带我
点赞 回复 分享
发布于 09-03 16:18 四川

相关推荐

10-13 22:56
门头沟学院 C++
rt,鼠鼠的浪潮网签明天过期,鼠鼠是山东人,好像自己也能接受。之前的面试大厂基本挂干净了,剩下小米二面后在泡,问了下面试官没有挂,但要泡。还有海信似乎也通过了,不过在深圳,鼠鼠也不是很想去。其它还有一些公司应该陆陆续续还有一些面试,现在有些纠结是直接签了还是再等再面呢?大佬们能不能给鼠鼠提一些意见,万分感谢!!!
牛客78696106...:浪潮可不是开摆,当初我还是开发的时候我组长跟我说他们组有段时间天天1,2点走,早上5点就来,全组肝出来心肌炎,浪潮挣钱省立花可不是说说,当然也看部门,但是浪潮普遍就那dio样,而且你算下时薪就知道不高,没事也是9点半走,不然算你旷工
投递小米集团等公司10个岗位
点赞 评论 收藏
分享
牛客37185681...:马德,我感觉这是我面过最恶心的公司,一面是两个女hr,说什么实习前几个月属于试用期,试用期过了才能转成正式实习生,我***笑了,问待遇就是不说,问能不能接受全栈,沙币公司
如果可以选,你最想去哪家...
点赞 评论 收藏
分享
爱读书的放鸽子能手很...:刷个两端实习,冲春招,流水线什么时候不能去
我的秋招日记
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务