您的位置:首页 > 编程语言 > Java开发

leetcode-java.T003_LongestSubstringWithoutRepeatingCharacters 给定一个字符串,找字符中的最大非重复子串

2017-06-05 02:00 806 查看
每天坚持刷leetcode----给定一个字符串,找字符中的最大非重复子串

package leetcode.T003_LongestSubstringWithoutRepeatingCharacters;

import java.util.HashMap;
import java.util.Map;

/**
* @author 周志祥 E-mail: 1579655633@qq.com
* @date 创建时间:2017-4-30 下午5:32:40
* @version 1.0
* @parameter
* @since
* @return
*/
public class Solution {
public static void main(String[] args) {
String s = "cbbabcbabbaccab";
System.out.println(lengthOfLongestSubstring(s));

}

/**
* <pre>
* Given a string, find the length of the longest substring without repeating characters.
* For example, the longest substring without repeating letters for "abcabcbb" is "abc",
* which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.
*
* 题目大意:
* 给定一个字符串,找字符中的最大非重复子串
*
* 解题思路:
* 用start记录当当处理的开始位置
* 历遍字符串,当当前字符从开始位置start开始已经出现过的时候,子串开始位置+1,否则更新map中的hash值为当前位置。
* </pre>
*
* @param s
* @return
*/
// 可以处理所有的UTF-8字符
public static int lengthOfLongestSubstring(String s) {

// 当前处理的开始位置(即:记录重复字符个数)
int start = 0;
// 无重复字符串最终长度
int result = 0;

// 创建一个HashMap集合,用来存放遍历的字符和对应位置
Map<Character, Integer> map = new HashMap<Character, Integer>(s.length());
// 循环遍历字符串,判断是否有重复字符ch,可以用Map中的containsKey方法判断
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
// 如果HashMap中包含该字符并且该
4000
字符的位置要大于start记录位置,就将start值增加1(记录重复字符个数)
if(map.containsKey(ch) && map.get(ch) >= start) {
start = map.get(ch) + 1;
}
// 如果不包含该字符,就将result结果增加(但是要去掉重复的字符个数,即:i-start+1)
else {
result = Math.max(result, i - start + 1);
}
// 将该字符和位置放入HashMap中
map.put(ch, i);
}

return result;
}
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐