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

来源:互联网 发布:足球数据分析软件 编辑:程序博客网 时间:2024/05/20 07:31

每天坚持刷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中包含该字符并且该字符的位置要大于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;    }}


阅读全文
0 0