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

本文介绍了解决LeetCode第003题“最长不含重复字符的子字符串”的方法。通过使用滑动窗口和哈希表记录字符最后出现的位置,有效地找出给定字符串中最长的不重复子串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

敬请关注博客,后期不断更新优质博文,谢谢

每天坚持刷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;
    }
}

欢迎加入Java猿社区
 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值