00后博主,正在自学中,有什么想法大家一起分享
🤳博主主页:Copping0606 😁
博主定期更新🤦♂️
谢谢你那么好看还关注我💖
算法题
这几天在刷算法,所有就分享一下我解题的过程,话不多说上题
这一题我认为也是还算简单的题,首先我们看看leetCode他给出的提示
提示:
0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成
当然也是没多大用,我们还是看题,题意大概就是我给你给字符串你必须给我返回这个字符串中没有重复的最长的那一个子字符串。
然在这里插入代码片
后我就一顿啪啪的编写了一段代码如下:
public class LeetCode3 {
//计算一个字符串中最长的子字符串
public static int lengthOfLongestSubstring(String s) {
//初始化记录记录上一个字串变量
StringBuffer longest=new StringBuffer();
//初始化记录记录当前字串变量
StringBuffer nowDataStr=new StringBuffer();
//遍历字串
for (int i=0;i<s.length();i++){
//覆盖字串
String nowData = String.valueOf(s.charAt(i));
if (nowDataStr.toString().contains(nowData)){
nowDataStr=new StringBuffer();
}
nowDataStr.append(nowData);
if (nowDataStr.length()>longest.length()){
longest = nowDataStr;
}
}
return longest.length();
}
public static void main(String[] args) {
String str="abcddcabef";
int a=lengthOfLongestSubstring(str);
System.out.println(a);
}
这时放在leetcode一看,嗯基本实列全过,提交~ding报错,实列800多个实列只过了300过一看问题当我字符串为dvdf时代码问题就出来了。如图
结果这里很明显不对,当串为dvdf时,应该时,最长的应该是vdf这一串,经过思考我发现我并没有考虑到当字串重复后需要将他重复的那个字符串之后的串拿过来,所以又改良了下代码如下
public class LeetCode3 {
//计算一个字符串中最长的子字符串
public static int lengthOfLongestSubstring(String s) {
//初始化记录记录上一个字串变量
StringBuffer longest=new StringBuffer();
//初始化记录记录当前字串变量
StringBuffer nowDataStr=new StringBuffer();
//遍历字串
for (int i=0;i<s.length();i++){
//覆盖字串
String nowData = String.valueOf(s.charAt(i));
if (nowDataStr.toString().contains(nowData)){
//获取从上一个字串中重复位置之后的字串
nowData=nowDataStr.substring(nowDataStr.indexOf(nowData)+1)+nowData;
nowDataStr=new StringBuffer();
}
nowDataStr.append(nowData);
if (nowDataStr.length()>longest.length()){
longest = nowDataStr;
}
}
return longest.length();
}
public static void main(String[] args) {
String str="dvdf";
int a=lengthOfLongestSubstring(str);
System.out.println(a);
}
}
然后测试了下下也是没有问题
再次提交到leetcode也是没有问题。
虽然可能我的代码不是最优解,但是至少能独立去做出来,也是相当哇塞了。
好了这一题也就没了。喜欢的别忘了给个关注。💖💖💖💖💖