이것은 제 오가와입니다 (391) , 제 업데이트 421 피안 원래
01 질문과 준비보고
소개 오늘은 LeetCode의 제목 알고리즘 쉬운 수준 (253 개) 질문 (전체 타이틀 번호는 1071 ). 문자열의 경우 S
와 T
, 경우에만 S = T + ... + T
( T
자신에 한 번 이상 연결시), 우리는 말한다 "T除S"
.
가장 큰 문자열을 반환 분할 , 분열 .X
X
str1
X
str2
예를 들면 :
입력 : STR1 = "ABCABC"STR2 = "ABC"
출력 "ABC"
입력 : STR1 = "ababab와"과 str2 = "ABAB"
출력 : "AB"
입력 : STR1 = "LEET"과 str2 = "CODE"
출력 : ""
참고 :
1 <= str1.length <= 1000
1 <= str2.length <= 1000
str1[i]
그리고str2[i]
대문자입니다.
제 02 해결
두 문자열을 요구하는 타이틀 식별하는 str1
, str2
최대 공약수,, 즉 str1
, str2
문자열 양자의 존재하에, 하나 이상의 회 이루어지는 문자열로 반복했다.
그래서, 어떤 상황에서 두 문자열의 어떤 최대 공약수가 없다?
전에 각 접합 후,하지만 동일하지 둘, 그것은 확실히 최대 공약수가 존재하지 않는 것입니다. 예를 들어, 상기 예에서 str1 ="ABCABC"
, str2 ="ABC"
, str1
스플 라이스 str2
후의하게 "ABCABCABC"
, str2
접합은 str1
후된다 "ABCABCABC"
. 그리고 str1 ="LEET"
, str2 ="CODE"
, str1
바느질은 str2
후하게 "LEETCODE"
, str2
접합은 str1
후하게 "CODELEET"
, 모두는 분명히 동일하지, 확실히 더 공약수가 없습니다.
그것이 그들이 그것의 최대 공약수를 찾는 방법은?
아이디어 : 문자열 분할로. 각각 상이한 서브 스트링 str1
과 str2
의해 분할 분할은 어떤 요소 남아 있지 않은 경우에있어서의 구현에서는, 스트링의 배열은 상기 스트링을 나눌 수 있음을 나타낸다. 실측치 개의 작은 문자열 길이,주기 수의 상한은, 연속적으로, 문자열 취출이면 문자열에서 찍은 분할 및 배열의 길이가 광학적 0 해결되었는지 세부 후, 문자열은 최대 공약수이다.String
split
str1
str2
public String gcdOfStrings(String str1, String str2) {
if (!(str1+str2).equals(str2+str1)) {
return "";
}
int n = Math.min(str1.length(), str2.length());
for (int i=n; i>=1; i--) {
String temp = str2.substring(0, i);
if (str2.split(temp).length == 0 &&
str1.split(temp).length == 0) {
return temp;
}
}
return "";
}
03 제 2 용액
여전히 속성의 캐릭터를 이용하여 첫 번째 솔루션과 유사한 아이디어는, 최대 공약수의 사용에 의해, 교체를 확인합니다 방법.String
replaceAll
public String gcdOfStrings2(String str1, String str2) {
if (!(str1+str2).equals(str2+str1)) {
return "";
}
int n = Math.min(str1.length(), str2.length());
for (int i=n; i>=1; i--) {
if (n%i != 0) {
continue;
}
String temp = str2.substring(0, i);
if(str1.replaceAll(temp,"").equals("") &&
str2.replaceAll(temp,"").equals("")) {
return temp;
}
}
return "";
}
04 세 번째 용액
우리는 또한보기의 수학적 관점에서 문제에 대해 생각할 수 있습니다.
아이디어 : 본 문자열의 길이는 두 개의 가장 큰 두 개의 작은 문자열 길이를 가지고 두 개의 정수, 두 개의 숫자, 최대 공약수가 계산의 최대 공약수를위한 단일 쓰기 알고리즘의 공약수 촬영 문자열은 문자열의 길이는 문자열이 문자열의 우리의 마지막 두 전공이 반환되는, 최대 공약수를 계산하기 이전 단계입니다.
public String gcdOfStrings3(String str1, String str2) {
if (!(str1+str2).equals(str2+str1)) {
return "";
}
int len = str1.length();
int len2 = str2.length();
int gcd = GCD(len, len2);
if (len < len2) {
return str1.substring(0, gcd);
}
return str2.substring(0, gcd);
}
public int GCD(int a, int b) {
if (b == 0) {
return a;
}
return a % b == 0 ? b : GCD(b, a % b);
}
제 05 용액
우리는 또한 세 번째 재귀 방법의 최대 공약수에 사용되는 솔루션 및 문자열 연산과 통합 할 수 있습니다.
그 중 하나가 될 때까지 두 문자열의 작은 길이가 더 큰 문자열에 교체로 문자열의 큰 길이, 모든 문자가 문자열은 문자열의 큰 길이보다 작은 길이를 포함하는 경우 발견 빈 문자열까지.
public String gcdOfStrings4(String str1, String str2) {
if (str1.length() < str2.length()) {
return gcdOfStrings4(str2, str1);
}
if (str2.isEmpty()) {
return str1;
}
if (!str1.contains(str2)) {
return "";
}
str1 = str1.replace(str2, "");
return gcdOfStrings4(str2, str1);
}
06 요약
주제 알고리즘은 계속되었습니다 일 이상 칠개월 , 특집 기사의 알고리즘 259 개 + 기사, 대중 번호 대화 상자 응답 [ 자료 구조와 알고리즘 ], [ 알고리즘 ], [ 데이터 구조 ] 중 기사 컬렉션 시리즈를 얻을 수있는 키워드 .
즉, 당신이 어떤 좋은 해결책 아이디어, 제안 또는 기타 문제가있는 경우, 아래 의견, 엄지 손가락을 교환 할 수 있습니다, 전부, 메시지 전달 및 지원은 나에게 가장 큰 보상이다!