Távolítson el egy karaktert a karakterláncból, hogy palindromává tegye
Adott egy karakterláncot meg kell vizsgálnunk, hogy lehet-e ebből a karakterláncból palindromot tenni, miután pontosan egy karaktert eltávolítunk belőle.
Példák:
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
Ezt a problémát úgy tudjuk megoldani, hogy megtaláljuk az eltérés helyzetét. A karakterlánc hurkolását úgy kezdjük, hogy mindkét végén tartunk két mutatót, amelyek a középső pozíció felé haladnak minden iteráció után ez az iteráció leáll, ha eltérést találunk, mivel csak egy karaktert lehet eltávolítani, itt két választásunk van
Eltérés esetén távolítsa el a bal mutatóval mutató karaktert, vagy távolítsa el a jobb egérmutatóval mutató karaktert.
Mindkét esetet ellenőrizni fogjuk, hogy ne felejtsük el, mivel mindkét oldalról azonos számú lépést tettünk meg, ennek a középső karakterláncnak is palindromnak kell lennie egy karakter eltávolítása után, így ellenőrizzük a két részstringet az egyik a bal, a másik a jobb karakter eltávolításával, és ha az egyik palindrom, akkor teljes string palindromot készíthetünk a megfelelő karakter eltávolításával, és ha nem lehetséges, akkor mindkét részkarakterlánc nem teljes. palindrom adott kényszer alatt.
Végrehajtás:
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>
Kimenet
Not Possible
Időbonyolultság: O(N)
A tér összetettsége: O(1)
Kvíz létrehozása