算法--最长无重复字符子串

转载请标明出处http://www.cnblogs.com/haozhengfei/p/d0906ebc98f7b6eaecb3ecd738dc78ac.html


最长无重复字符子串练习题

最长无重复字符子串练习

第12节 最长无重复字符子串练习题

对于一个字符串,请设计一个高效算法,找到字符串的最长无重复字符的子串长度。

给定一个字符串A及它的长度n,请返回它的最长无重复字符子串长度。保证A中字符全部为小写英文字符,且长度小于等于500。

测试样例:

"aabcb",5
返回:3

Java (javac 1.7)

代码自动补全

1

import java.util.*;

2


3

public class DistinctSubstring {

4

    public int longestSubstring(String A, int n) {

5

        //charPosition统计A中每种字符之前出现的位置

6

        Map<Character, Integer> charPosition = new HashMap<Character, Integer>();

7

        //preArr代表以s[i-1]结尾的情况下,最长无重复子串的长度

8

        int[] preArr = new int[A.length()];

9


10

        char[] str2charArr = A.toCharArray();

11

        //从头到尾遍历str2charArr,统计出以每个字符为当前位置的向前最长无重复子串的长度

12

        for(int i=0; i<A.length(); i++){

13

            Integer lastPosOfChar = charPosition.get(str2charArr[i]);

14

            if(lastPosOfChar == null){//说明当前字符第一次出现

15

                //更新最长无重复子串的长度

16

                preArr[i] = i == 0 ? 1 : preArr[i-1] + 1;

17

                //记录当前字符出现的位置

18

                charPosition.put(str2charArr[i], i);

19

            }

20

            else{//当前字符不是第一次出现(既然不是第一次出现,那也不是在第一个位置),也就是之前出现过该字符

21

                //获取前一个字符最长无重复子串的长度

22

                int aPos = lastPosOfChar + 1;

23

                int unRepeatLen = preArr[i-1];

24

                int bPos = i - unRepeatLen;

25

                if(aPos >= bPos){

26

                    //当前位置的最长无重复子串长度

27

                    preArr[i] = i - aPos + 1;

28

                }

29

                else{

30

                    //当前位置的最长无重复子串长度

31

                    preArr[i] = i - bPos + 1;

32

                }

33

                //跟新当前字符出现的位置

34

                charPosition.put(str2charArr[i], i);

35

            }

36

        }

37

        //遍历preArr,最大值即为所求

38

        int max = preArr[0];

39

        for(int i: preArr) if(i > max) max = i;

40


41

        return max;

42

    }

43

}

您的代码已保存
答案正确:恭喜!您提交的程序通过了所有的测试用例

运行

时间: 2024-08-03 12:42:22

算法--最长无重复字符子串的相关文章

字符串练习(八):最长无重复字符子串

对于一个字符串,请设计一个高效算法,找到字符串的最长无重复字符的子串长度. 给定一个字符串A及它的长度n,请返回它的最长无重复字符子串长度.保证A中字符全部为小写英文字符,且长度小于等于500. 测试样例: "aabcb",5 返回:3 public class DistinctSubstring { public int longestSubstring(String A, int n) { // write code here if(A==null || n==0){ return

最长无重复字符子串

1 题目 Given a string,find the length of the longest substring without repeating characters. Forexample, the longest substring without repeating letters for"abcabcbb" is "abc", which the length is 3. For"bbbbb" the longest subs

求字符串的最长无重复字符子串长度

题目: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3. 示例 2: 输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1. 示例 3: 输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wk

Leetcode 3 Longest Substring Without Repeating Characters. (最长无重复字符子串) (滑动窗口, 双指针)

目录 问题描述 例子 方法 Leetcode 3 问题描述 Given a string, find the length of the longest substring without repeating characters. 例子 Example 1: Input: "abcabcbb" Output: 3 Explanation: The answer is "abc", with the length of 3. Example 2: Input: &q

符串的最长无重复字符的子串长度

题目描述: 对于一个字符串,请设计一个高效算法,找到字符串的最长无重复字符的子串长度. 给定一个字符串A及它的长度n,请返回它的最长无重复字符子串长度.保证A中字符全部为小写英文字符,且长度小于等于500. 测试样例: "abcdbefgdchi",12 返回:8 这个题我研究了好半天,确实不好想,看了别人的思路,半天才把代码写出来 分析: 首先定义三个辅助变量: max_len:表示字符串中最长无重复字符的子串长度,也就是函数返回值 map<char, int>:用来存放

lintcode 中等题:longest substring without repeating characters 最长无重复字符的子串

题目 最长无重复字符的子串给定一个字符串,请找出其中无重复字符的最长子字符串. 例如,在"abcabcbb"中,其无重复字符的最长子字符串是"abc",其长度为 3. 对于,"bbbbb",其无重复字符的最长子字符串为"b",长度为1. 解题 利用HashMap,map中不存在就一直加入,存在的时候,找到相同字符的位置,情况map,更改下标 public class Solution { /** * @param s: a s

BAT面试算法进阶(2)- 无重复字符的最长子串(暴力法)

一.算法题 题目 Given a string, find the length of the longest substring without repeating characters. Example Given "abcabcbb", the answer is "abc", which the length is 3. Given "bbbbb", the answer is "b", with the length

[LeetCode] Longest Substring Without Repeating Characters 最长无重复字符的子串 C++语言 java语言实现

Given a string, find the length of the longest substring without repeating characters. Example 1: Input: "abcabcbb" Output: 3 Explanation: The answer is "abc", with the length of 3. Example 2: Input: "bbbbb" Output: 1 Explana

查找字符串中最长无重复字符的子串

设定一个当前子字符串:tempString 设定一个保持最长无重复子串的数组:list 思路: 从第一个字符开始判断, 如果当前子串不包括当前的字符,则当前子串加入当前的字符成为新的当前子串, 如果当前子串包括当前的字符,判断当前字符在当前字符串中的位置,根据这个位置把字符串分成两个字符串,如果后面一个末尾加当前字符为新的当前子字符串,判断当前子串跟list数组中的子串长度,如果当前子串长,则清空list,把当前子串加入:如果相等,直接将当前子串加入list. 最后list的中的子字符串就是最长