문자의 어떤 반복 긴 문자열 없습니다 : 48 개 얼굴 질문
하나, 제목 설명
문자열에서 문자를 반복 포함하지 않는 긴 일반적인 문자열을 찾아주세요, 우리는 가장 긴 문자열의 길이를 계산합니다. 가정하자 문자열의 'A'에서 'Z'에서 유일한 문자가 포함되어 있습니다.
예를 들어, 문자의 긴 문자열을 제외한 문자열 "arabcacfr"는, 4의 길이를 "acfr"를 반복한다.
둘째, 문제 분석
실전 문제, 제 문제를 분석 알고리즘의 사용은 분석의 결과에 의해 결정된다.
일반적으로, 우리는 종이에 기본적인 상황의 일부 목록을 그릴 종이에 펜을 넣어 것입니다. 이 질문의 분석 후 관계에서 찾을 수 있습니다.
정의 함수 (F)는 (ⅰ)이다 : 없음 반복되는 문자의 마지막에, i 번째 문자에서의 문자열의 최대 길이.
i 번째 문자가 보이지 않았다 전에 (1)가 : F (I) = F (I-1) +1
(2) i 번째 문자 앞에 나타나 마지막 문자가 나타납니다의 위치를 기록 할 때 거리 (d)
- D는 <= f는 (I-1), (F)이있는 경우 (나) = D;
- 만약 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;
}