문자열에서 문자를 제거하여 회문으로 만듭니다.
주어진 문자열에서 정확히 한 문자를 제거한 후 이 문자열을 회문으로 만드는 것이 가능한지 확인해야 합니다.
예:
Input : str = abcba Output : Yes we can remove character ‘c’ to make string palindrome Input : str = abcbea Output : Yes we can remove character ‘e’ to make string palindrome Input : str = abecbea It is not possible to make this string palindrome just by removing one character
불일치 위치를 찾아 이 문제를 해결할 수 있습니다. 각 반복 후에 중간 위치를 향해 이동하는 두 개의 포인터를 양쪽 끝에 유지하여 문자열에서 반복을 시작합니다. 이 반복은 불일치를 발견하면 중지됩니다. 문자 하나만 제거할 수 있으므로 여기서는 두 가지 선택이 있습니다.
불일치 시 왼쪽 포인터가 가리키는 문자를 제거하거나 오른쪽 포인터가 가리키는 문자를 제거합니다.
양쪽에서 동일한 수의 단계를 탐색했기 때문에 이 중간 문자열도 하나의 문자를 제거한 후 회문이어야 하므로 왼쪽 문자를 제거하고 다른 하나는 오른쪽 문자를 제거하여 두 개의 하위 문자열을 확인하고 그 중 하나가 회문인 경우 해당 문자를 제거하여 완전한 문자열 회문을 만들 수 있으며 두 하위 문자열이 모두 회문이 아닌 경우 주어진 제약 조건에서 전체 문자열을 회문으로 만드는 것이 불가능하다는 점을 기억하십시오.
구현:
C++ // C/C++ program to check whether it is possible to make // string palindrome by removing one character #include using namespace std ; // Utility method to check if substring from low to high is // palindrome or not. bool isPalindrome ( string :: iterator low string :: iterator high ) { while ( low < high ) { if ( * low != * high ) return false ; low ++ ; high -- ; } return true ; } // This method returns -1 if it is not possible to make string // a palindrome. It returns -2 if string is already a palindrome. // Otherwise it returns index of character whose removal can // make the whole string palindrome. int possiblePalinByRemovingOneChar ( string str ) { // Initialize low and high by both the ends of the string int low = 0 high = str . length () - 1 ; // loop until low and high cross each other while ( low < high ) { // If both characters are equal then move both pointer // towards end if ( str [ low ] == str [ high ]) { low ++ ; high -- ; } else { /* If removing str[low] makes the whole string palindrome. We basically check if substring str[low+1..high] is palindrome or not. */ if ( isPalindrome ( str . begin () + low + 1 str . begin () + high )) return low ; /* If removing str[high] makes the whole string palindrome We basically check if substring str[low+1..high] is palindrome or not. */ if ( isPalindrome ( str . begin () + low str . begin () + high - 1 )) return high ; return -1 ; } } // We reach here when complete string will be palindrome // if complete string is palindrome then return mid character return -2 ; } // Driver code to test above methods int main () { string str = 'abecbea' ; int idx = possiblePalinByRemovingOneChar ( str ); if ( idx == -1 ) cout < < 'Not Possible n ' ; else if ( idx == -2 ) cout < < 'Possible without removing any character' ; else cout < < 'Possible by removing character' < < ' at index ' < < idx < < ' n ' ; return 0 ; }
Java // Java program to check whether // it is possible to make string // palindrome by removing one character import java.util.* ; class GFG { // Utility method to check if // substring from low to high is // palindrome or not. static boolean isPalindrome ( String str int low int high ) { while ( low < high ) { if ( str . charAt ( low ) != str . charAt ( high )) return false ; low ++ ; high -- ; } return true ; } // This method returns -1 if it is // not possible to make string a palindrome. // It returns -2 if string is already // a palindrome. Otherwise it returns // index of character whose removal can // make the whole string palindrome. static int possiblePalinByRemovingOneChar ( String str ) { // Initialize low and right // by both the ends of the string int low = 0 high = str . length () - 1 ; // loop until low and // high cross each other while ( low < high ) { // If both characters are equal then // move both pointer towards end if ( str . charAt ( low ) == str . charAt ( high )) { low ++ ; high -- ; } else { /* * If removing str[low] makes the * whole string palindrome. We basically * check if substring str[low+1..high] * is palindrome or not. */ if ( isPalindrome ( str low + 1 high )) return low ; /* * If removing str[high] makes the whole string * palindrome. We basically check if substring * str[low+1..high] is palindrome or not. */ if ( isPalindrome ( str low high - 1 )) return high ; return - 1 ; } } // We reach here when complete string // will be palindrome if complete string // is palindrome then return mid character return - 2 ; } // Driver Code public static void main ( String [] args ) { String str = 'abecbea' ; int idx = possiblePalinByRemovingOneChar ( str ); if ( idx == - 1 ) System . out . println ( 'Not Possible' ); else if ( idx == - 2 ) System . out . println ( 'Possible without ' + 'removing any character' ); else System . out . println ( 'Possible by removing' + ' character at index ' + idx ); } } // This code is contributed by // sanjeev2552
Python3 # Python program to check whether it is possible to make # string palindrome by removing one character # Utility method to check if substring from # low to high is palindrome or not. def isPalindrome ( string : str low : int high : int ) -> bool : while low < high : if string [ low ] != string [ high ]: return False low += 1 high -= 1 return True # This method returns -1 if it # is not possible to make string # a palindrome. It returns -2 if # string is already a palindrome. # Otherwise it returns index of # character whose removal can # make the whole string palindrome. def possiblepalinByRemovingOneChar ( string : str ) -> int : # Initialize low and right by # both the ends of the string low = 0 high = len ( string ) - 1 # loop until low and high cross each other while low < high : # If both characters are equal then # move both pointer towards end if string [ low ] == string [ high ]: low += 1 high -= 1 else : # If removing str[low] makes the whole string palindrome. # We basically check if substring str[low+1..high] is # palindrome or not. if isPalindrome ( string low + 1 high ): return low # If removing str[high] makes the whole string palindrome # We basically check if substring str[low+1..high] is # palindrome or not if isPalindrome ( string low high - 1 ): return high return - 1 # We reach here when complete string will be palindrome # if complete string is palindrome then return mid character return - 2 # Driver Code if __name__ == '__main__' : string = 'abecbea' idx = possiblepalinByRemovingOneChar ( string ) if idx == - 1 : print ( 'Not possible' ) else if idx == - 2 : print ( 'Possible without removing any character' ) else : print ( 'Possible by removing character at index' idx ) # This code is contributed by # sanjeev2552
C# // C# program to check whether // it is possible to make string // palindrome by removing one character using System ; class GFG { // Utility method to check if // substring from low to high is // palindrome or not. static bool isPalindrome ( string str int low int high ) { while ( low < high ) { if ( str [ low ] != str [ high ]) return false ; low ++ ; high -- ; } return true ; } // This method returns -1 if it is // not possible to make string a palindrome. // It returns -2 if string is already // a palindrome. Otherwise it returns // index of character whose removal can // make the whole string palindrome. static int possiblePalinByRemovingOneChar ( string str ) { // Initialize low and right // by both the ends of the string int low = 0 high = str . Length - 1 ; // loop until low and // high cross each other while ( low < high ) { // If both characters are equal then // move both pointer towards end if ( str [ low ] == str [ high ]) { low ++ ; high -- ; } else { /* * If removing str[low] makes the * whole string palindrome. We basically * check if substring str[low+1..high] * is palindrome or not. */ if ( isPalindrome ( str low + 1 high )) return low ; /* * If removing str[high] makes the whole string * palindrome. We basically check if substring * str[low+1..high] is palindrome or not. */ if ( isPalindrome ( str low high - 1 )) return high ; return - 1 ; } } // We reach here when complete string // will be palindrome if complete string // is palindrome then return mid character return - 2 ; } // Driver Code public static void Main ( String [] args ) { string str = 'abecbea' ; int idx = possiblePalinByRemovingOneChar ( str ); if ( idx == - 1 ) Console . Write ( 'Not Possible' ); else if ( idx == - 2 ) Console . Write ( 'Possible without ' + 'removing any character' ); else Console . Write ( 'Possible by removing' + ' character at index ' + idx ); } } // This code is contributed by shivanisinghss2110
JavaScript < script > // JavaScript program to check whether // it is possible to make string // palindrome by removing one character // Utility method to check if // substring from low to high is // palindrome or not. function isPalindrome ( str low high ) { while ( low < high ) { if ( str . charAt ( low ) != str . charAt ( high )) return false ; low ++ ; high -- ; } return true ; } // This method returns -1 if it is // not possible to make string a palindrome. // It returns -2 if string is already // a palindrome. Otherwise it returns // index of character whose removal can // make the whole string palindrome. function possiblePalinByRemovingOneChar ( str ) { // Initialize low and right // by both the ends of the string var low = 0 high = str . length - 1 ; // loop until low and // high cross each other while ( low < high ) { // If both characters are equal then // move both pointer towards end if ( str . charAt ( low ) == str . charAt ( high )) { low ++ ; high -- ; } else { /* * If removing str[low] makes the * whole string palindrome. We basically * check if substring str[low+1..high] * is palindrome or not. */ if ( isPalindrome ( str low + 1 high )) return low ; /* * If removing str[high] makes the whole string * palindrome. We basically check if substring * str[low+1..high] is palindrome or not. */ if ( isPalindrome ( str low high - 1 )) return high ; return - 1 ; } } // We reach here when complete string // will be palindrome if complete string // is palindrome then return mid character return - 2 ; } // Driver Code var str = 'abecbea' ; var idx = possiblePalinByRemovingOneChar ( str ); if ( idx == - 1 ) document . write ( 'Not Possible' ); else if ( idx == - 2 ) document . write ( 'Possible without ' + 'removing any character' ); else document . write ( 'Possible by removing' + ' character at index ' + idx ); // this code is contributed by shivanisinghss2110 < /script>
산출
Not Possible
시간복잡도 : O(N)
공간 복잡도: O(1)
퀴즈 만들기