Advertisement

剑指offer第二版面试题48:最长不含重复字符的最大子串

阅读量:

题目描述:
要求从给定的字符串中识别出一个不含重复字符的最长子字符串,并求出该子字符串的长度。假设字符串仅由小写字母’a’至’z’组成。例如,在字符串”arabcacfr”中,最长非重复子字符串为”acfr”,其长度为4。

分析思路:
采用动态规划的方法,记录当前字符之前所对应的最长非重复子字符串长度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。

代码如下:

写法1

复制代码
    /** * 最长不含重复字符的子字符串
     */
    public class LongestSubString {
    
    	public int longestSubStringWithout(String str) {
    		int[] position = new int[26];

全部评论 (0)

还没有任何评论哟~