问题:
给定一个字符串,找出不含有重复字符的最长子串的长度。
问题示例:
输入: "pwwkew" 输出: 3 解释: 无重复字符的最长子串是"wke"
,其长度为 3。 请注意,答案必须是一个子串,"pwke"
是一个子序列 而不是子串。
解决方案:
题目的问题是求无重复的最长字串的长度,也就是求最大的下标范围[i,j]。
初始的i=0,j=0。我们的目标就是尽可能扩大j-i的数值并且使得字串内没有重复字母。
我们用ans记录这个最大范围,不断扩大j的值,若出现了重复字符,则i设为该重复字符的下标
使得ans=max(当前最大值,之前的ans值)
下面是java代码
package com.lmm.LeedCode;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
/**
* @author lmm E-mail:violet_mmhh@163.com
* @version 时间:2018年9月28日
* @question 给定一个字符串,找出不含有重复字符的最长子串的长度。
*/
public class Solution0003 {
public static int lengthOfLongestSubstring(String s) {
int n = s.length(), ans = 0;
// int left = 0,right=0;
Map<Character, Integer> map = new HashMap<>(); // 字母的当前索引值
// 尝试去扩大范围 [i, j]
for (int j = 0, i = 0; j < n; j++) {
if (map.containsKey(s.charAt(j)))
i = Math.max(map.get(s.charAt(j)), i);
ans = Math.max(ans, j - i + 1);
map.put(s.charAt(j), j + 1);
}
// System.out.println("最长字串为:"+s.substring(i, j));
return ans;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.next();
System.out.println("最长不重复字串的长度为:" + lengthOfLongestSubstring(s));
}
}
运行结果: