문자열 s가 주어지면 파티션의 모든 부분 문자열이 회문이되도록 파티션을 만듭니다. s의 모든 palindrome 파티셔닝을 반환합니다.회문 분해 알고리즘의 시간 복잡도
나는 회문의 회문 분해를 되돌리기위한 논리를 썼다. 나는이 시간 복잡성을 몰아 가는데 어려움을 겪고있다. 루프 내에서 재귀 호출
논리는 첫 번째 문자부터 시작하여 각 부분 문자열을 반복하고, 회귀선을 찾으면 나머지 부분부터 시작하여 다음 하위 문자열을 검사합니다. 우리는 중독이 반복적으로
사람이
public class Solution {
public List<List<String>> partition(String s) {
List<List<String>> result = new ArrayList<List<String>>();
List<String> palindromePartition = new ArrayList<String>();
int start=0;
decompose(s,0,palindromePartition,result);
return result;
}
private void decompose(String input,int startIndex,List<String> palindromePartition,List<List<String>> result) {
if(startIndex==input.length())
{
ArrayList<String> partitionResult = new ArrayList<String>(palindromePartition);
result.add(partitionResult);
return;
}
for(int i=startIndex+1;i<=input.length();i++){
if(isPalindrome(input.substring(startIndex,i))){
palindromePartition.add(input.substring(startIndex,i));
decompose(input,i,palindromePartition,result);
palindromePartition.remove(palindromePartition.size()-1);
}
}
}
private boolean isPalindrome(String input){
int left=0;
int right=input.length()-1;
while(right>left){
if(input.charAt(left)!=input.charAt(right))
return false;
left++;
right--;
}
return true;
}
설명을 자세히 설명해 주셔서 감사합니다. 그러나 단순한 방식으로 생각한 방식은 n 개의 characcter 문자열에 대해 총 2^n-1 개의 파티션이있는 반면 논리는 각 파티션을보고 palindrome이 있는지 확인하여 시간 복잡성을 O (n * 2^n-1). 그게 옳지 않아? – KBR
2^n-1을 어떻게 얻었는지 말해 줄 수 있습니까? 또한, 나는 방금 수학이 틀렸다는 것을 알아 냈습니다. 그것은 O (n!)가 아니라 O (n^n)가되어야합니다. 나는 그것을 고쳤다. – UnknowableIneffable
수 있습니다. 문자열 "abc"가 있으면 문자열의 각 문자 사이에 나눌 수 있습니다. 즉, n 개의 문자열, split-n-1 옵션을 가질 수 있습니다. 각 장소에 분할 또는 분할 할 수 있다는 사실을 고려하면 2^n-1까지 걸립니다. abc에 대한 스플릿은 (a | b | c, a | bc, ab | c, abc) – KBR