java 最长不重复子串,最长无重复字符子串
Posted 快乐崇拜234
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 最长不重复子串,最长无重复字符子串相关的知识,希望对你有一定的参考价值。
正文在下面,先打个广告:
问题描述:
输入:abdca 返回:abdc
方法一:使用双指针(滑动窗口)来实现。该方法需要配合map保存已经出现过的字符。
public static int maxLength(String nums, int begin, int end, int maxStr)
if (null == nums || nums.length() == 0) return 0;
if (end>=nums.length()) return maxStr;
Map<Character, Integer> map = new HashMap<>();
for (int i = begin; i <= nums.length()-1 ; i++)
if (null == map.get(nums.charAt(i)))
map.put(nums.charAt(i), i);
if(map.size() > maxStr)
maxStr = map.size();
else
begin = map.get(nums.charAt(i)) + 1;
break;
return maxLength(nums, begin, end+1, maxStr);
public static void main(String[] args)
System.out.println(maxLength("arabcacfr",0,1,1));
System.out.println(maxLength("aababcbcd",0,1,1));
System.out.println(maxLength("ccccc",0,1,1));
System.out.println(maxLength("",0,1,1));
System.out.println(maxLength("c",0,1,1));
System.out.println(maxLength("ac",0,1,1));
System.out.println(maxLength(null,0,1,1));
测试结果:
4
3
1
0
1
2
0
方法二:使用动态规划,记录当前字符之前的最长非重复子字符串长度f(i-1),其中i为当前字符的位置。每次遍历当前字符时,分两种情况:
1)若当前字符第一次出现,则最长非重复子字符串长度f(i) = f(i-1)+1。
2)若当前字符不是第一次出现,则首先计算当前字符与它上次出现位置之间的距离d。若d大于f(i-1),即说明前一个非重复子字符串中没有包含当前字符,则可以添加当前字符到前一个非重复子字符串中,所以,f(i) = f(i-1)+1。若d小于或等于f(i-1),即说明前一个非重复子字符串中已经包含当前字符,则不可以添加当前字符,所以,f(i) = d。
关键点: 动态规划,两个重复字符的距离
public static int maxLength(String str)
if(str==null || str.equals(""))
return 0;
int maxLength=0;
int curLength=0;
int[] position = new int[26];
for(int i=0;i<position.length;i++)
position[i]=-1; //初始化为-1,负数表示没出现过
for(int i=0;i<str.length();i++)
int prevIndex = position[str.charAt(i)-'a'];
int distance=i-prevIndex;
//如果当前字符没有出现过,或者出现后的d大于当前最长字串长度
if(prevIndex<0 || distance>curLength)
curLength++;
else //如果d<=当前最长字串长度,说明两个相同字符在最长字串中
if(curLength > maxLength)
maxLength = curLength;
curLength = distance;
position[str.charAt(i)-'a'] = i; //更新当前字符出现的位置
if(curLength>maxLength)
maxLength=curLength;
return maxLength;
以上是关于java 最长不重复子串,最长无重复字符子串的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode--003--无重复字符的最长子串(java)
LeetCode 3. 无重复字符的最长子串(动态规划,HashMap,Java)