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