java算法:用滑动窗口求最长子字符串问题

package xyz.jangle.string;

import java.util.HashSet;

public class StringMain5TestHDCK {

	public static void main(String[] args) {
		
		String str = "abcadfadfawer";

		System.out.println(test(str));
	}
	/**
	 * 最长子字符串(滑动窗口求解)
	 * @param str
	 * @return
	 */
	public static int test(String str) {
		if(str == null || str.isEmpty())
			return 0;
		// 左边
		int left=0;
		// 结果
		int result=0;
		// 存储最长子串的字符
		HashSet<Character> set = new HashSet<Character>();
		// 滑动右指针,如果指向的字符存在于set集中,则删除左指针指向的值并右移左指针。直到不存在于set集中,添加右指针指向的值。
		for(int right=0;right<str.length();right++) {
			while(set.contains(str.charAt(right))) {
				set.remove(str.charAt(left));
				left++;
			}
			set.add(str.charAt(right));
//			System.out.println(result +","+ (right-left+1)+"left:"+left+",right:"+right);
			// 记录最长子字符串的长度
			result = Math.max(result, right-left+1);
		}
		return result;
		
	}
	

}

解法2:

pub
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值