进坑了 最大不重复串 Longest SubString Without Repeating Character

---恢复内容开始---

https://leetcode.com/problems/longest-substring-without-repeating-characters

OJ网站通常会先给出几个简单test case 来测试你的代码是否得出正确的答案,你在这些实例上没有通过,你也不会提交了,但是你这些实例通过了,

也未必是正确的解法,网站后台也会有其他的一些特殊或者边界的实例去测试你的代码,我之前看过的一些OJ并不会把这些实例反馈给你。

(是因为不想别人恶意刷题吧)通常感觉自己WA了,但是为什么WA自己通常毫无头绪,这个网站就很贴心的把不通过的实例显示出来,

然后我就自己通过调试把自己思路或者代码中的缺点给一步步修改掉。当然,这样做感觉有利有弊,利是方便了,可以很快的知道自己是哪里出错了,

当然怎么修改还是自己去想的,弊是实际的开发情况是没人告诉你你的问题存在有哪些特殊情况,你的代码哪里哪里有缺陷,而当出现问题的时候就蒙逼,

而且一直蒙逼的可能会更大,因为你自己找出问题的能力就锻炼不到了。而这次的做题,我几乎把这题的所有实例都翻出来了。自己找问题,感觉太难了。

最开始网站给我的实例是这样的: "abcabcbb" "bbbbb" "pwwkew" 

后面我没有通过的实例:"aab", "abb", "abba", "dvdf", "c"

一言不合,上代码:

public class LSWRC {
	public static void main(String[] args) {
		String []s = {"abcabcbb","dvdf" , "bbbbb", 
				"pwwkew", "aab", "abb", "abba", "dvdf", "c"};
		for(String str: s)
		{
			System.out.println(str+":"+new       Solution().lengthOfLongestSubstring(str));
		}
	}
}
class Solution{
	public int lengthOfLongestSubstring(String s) {
		char[] ch = s.toCharArray() ;
		int maxlen = 1 ;
		StringBuilder sub = new StringBuilder(String.valueOf(ch[0]));
		for(int i=1 ;i< ch.length ;i++){
			int newrepeat = sub.indexOf(String.valueOf(ch[i]) ) ; 
			if(newrepeat>=0){   		
				sub.replace(0,newrepeat+1, "") ; //出现了重复 就把前面的 截掉
			}
			sub.append(ch[i]) ;
			maxlen = sub.length() > maxlen ? sub.length(): maxlen ;
		}
		return maxlen;
    }
}

  

  其实就是求出以当前遍历的字符为结尾的最长不重复串 ,

假设以当前下标是 i-1 的字符为结尾 最长不重复串 是  sub[x ~ i-1]  

如果sub[i]  在  sub[x ~ i-1]   中没有重复 ,那么 以 i 为结尾的最长不重复串 就是  sub[x ~ i]  

如果有重复 , 找出重复开始的位置, 假设 y 下标和 i 下标 是重复的, 那么 当前的 最长不重复串 就是  sub[y+1 ~ i ] .

就算是这么简单的算法 , 那时也是想了很多弯路, 花了好久 , 不过 是目前最满意的代码. 

 

posted @ 2016-04-24 14:53  javacoderbill  阅读(202)  评论(0)    收藏  举报