아무 문자의 긴 문자열을 반복 - 모집 유창은 시리즈 승리

문자의 어떤 반복 긴 문자열 없습니다 : 48 개 얼굴 질문

하나, 제목 설명

문자열에서 문자를 반복 포함하지 않는 긴 일반적인 문자열을 찾아주세요, 우리는 가장 긴 문자열의 길이를 계산합니다. 가정하자 문자열의 'A'에서 'Z'에서 유일한 문자가 포함되어 있습니다.

예를 들어, 문자의 긴 문자열을 제외한 문자열 "arabcacfr"는, 4의 길이를 "acfr"를 반복한다.

둘째, 문제 분석

실전 문제, 제 문제를 분석 알고리즘의 사용은 분석의 결과에 의해 결정된다.

일반적으로, 우리는 종이에 기본적인 상황의 일부 목록을 그릴 종이에 펜을 넣어 것입니다. 이 질문의 분석 후 관계에서 찾을 수 있습니다.

정의 함수 (F)는 (ⅰ)이다 : 없음 반복되는 문자의 마지막에, i 번째 문자에서의 문자열의 최대 길이.
i 번째 문자가 보이지 않았다 전에 (1)가 : F (I) = F (I-1) +1
(2) i 번째 문자 앞에 나타나 마지막 문자가 나타납니다의 위치를 기록 할 때 거리 (d)

  1. D는 <= f는 (I-1), (F)이있는 경우 (나) = D;
  2. 만약 D> F (I-1), F가 (I) = F (I-1) +1]

트래버스는 첫 번째 문자에서 시작하고, F를 (I-1), F (I)로 나타낼 때 INT 변수 preLength curLength을 정의하고, 마지막에 검출 된 26 개 개의 문자를 저장하는 길이 POS (26)의 배열을 생성 할 상기 설명을 해결하기 위해, 위치.

셋째, 문제는 해결된다

    public int  maxLength(String str) {
        if(str==null || str.length()<=0) {
            return 0;
        }
        // 即f(i-1)
        int preLength=0;
        // 即f(i)
        int curLength;
        int maxLength=0;
        // 用于存放字母上次出现的位置
        int[] pos= new int[26];
        Arrays.fill(pos, 0);

        for(int i=0;i<str.length();i++) {
            int letterNumber = str.charAt(i)-'a';
            if(pos[letterNumber]<0 || i-pos[letterNumber]>preLength) {
                curLength=preLength + 1;
            } else {
                curLength=i-pos[letterNumber];
            }
            pos[letterNumber]=i;
            if(curLength>maxLength) {
                maxLength=curLength;
            }
            preLength=curLength;
        }
        return maxLength;
    }
게시 된 166 개 원래 기사 · 원 찬양 3236 ·은 460,000 + 조회수

추천

출처blog.csdn.net/qq_42322103/article/details/104118586