最长不重复子串

1. 前言

最近看了LeetCode上的一道题,想了很久才摸明白其中的逻辑,网站上有很多答题者提交了自己的代码,实现方式是多种多样,也包含很多种程序语言。因此,我这里记录下Java版本的,供日后查阅。

2. 题型

给定一个字符串,查找最长的子串的长度没有重复字符。

示例1:

输入:“abcabcbb”
输出:3
解释:答案是“abc”,长度是3.

示例2:

输入:“bbbbb”
输出:1
解释:答案是“b”,长度是1。

示例3:

输入:“pwwkew”
输出:3
解释:答案是“wke”,长度是3。
注意,答案必须是一个字符串,“pwke”是子序列而不是子字符串。

3. 代码实现

Java:

class Solution {
	public static void main(String[] args) {
		String s = "abcabcbb";
		System.out.println(s + "最长不重复子串长度为:" + lengthOfLongestSubstring(s));
	}

	public static int lengthOfLongestSubstring(String s) {
		int[] hash = new int[256];
		System.out.println("初始化数组hash:" + Arrays.toString(hash));
		int max = 0;
		int i = 0, j = 0, count = 0;
		while (i < s.length() && j < s.length()) {
			char ch = s.charAt(j);
			if (hash[ch] == 0) {
				System.out
						.println("hash['" + ch + "']=hash[" + (int) ch + "]=" + hash[ch] + ",第" + (j + 1) + "个字符" + ch);
				hash[ch] = 1;
				j++;
				max = (j - i) > max ? (j - i) : max;
			} else {
				char c = s.charAt(i);
				System.out.println("\nhash['" + c + "']=hash[" + (int) c + "]=" + hash[c] + ",第" + (j + 1) + "个字符" + c
						+ "与第" + (i+1) + "个字符重复\n");
				hash[c] = 0;
				i++;
			}
			count++;
		}
		System.out.println("赋值后数组hash:" + Arrays.toString(hash));
		System.out.println("总统计次数为:" + count);
		return max;
	}
}

console:

初始化数组hash:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
hash['a']=hash[97]=0,第1个字符a
hash['b']=hash[98]=0,第2个字符b
hash['c']=hash[99]=0,第3个字符c

hash['a']=hash[97]=1,第4个字符a与第1个字符重复

hash['a']=hash[97]=0,第4个字符a

hash['b']=hash[98]=1,第5个字符b与第2个字符重复

hash['b']=hash[98]=0,第5个字符b

hash['c']=hash[99]=1,第6个字符c与第3个字符重复

hash['c']=hash[99]=0,第6个字符c

hash['a']=hash[97]=1,第7个字符a与第4个字符重复


hash['b']=hash[98]=1,第7个字符b与第5个字符重复

hash['b']=hash[98]=0,第7个字符b

hash['c']=hash[99]=1,第8个字符c与第6个字符重复


hash['b']=hash[98]=1,第8个字符b与第7个字符重复

hash['b']=hash[98]=0,第8个字符b
赋值后数组hash:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
总统计次数为:15
abcabcbb最长不重复子串长度为:3


4. 总结

通过这次练习,发现自己的解题思路不是很清晰。以前遇到一个问题总是会仔细琢磨,争分夺秒的去解决;现在总是想偷懒,遇到问题就想退缩,也不自己去思考问题,而想用百度来解决问题。如果长期如此,必会恶性循环,导致自己越来越懒惰,技术思维一直停滞不前。一方面,我为自己的懒惰感到羞耻;另一方面,也为自己的渺小感到失落迷惘。在知识的海洋里,感觉自己是沧海一粟,任何方面都做的不够好。迷茫,担忧,伤感或许正好可以来形容我。但是,谁不是从零开始的呢?人生没有捷径,脚踏实地走好每一步,扎扎实实学技术才是对自己最大的回报!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值