给定一个字符串,找到给定字符串的所有可能的回文分区。
例子:
请注意,此问题与回文式分区问题不同,那里的任务是找到在输入字符串具有最少剪切的分区。在这里,我们需要打印所有可能的分区。
这个想法是从第一个字符开始遍历每个子串,检查它是否是回文。如果是,则将子字符串添加到解决方案,然后重复其余部分。下面是完整的算法。
以下是上述想法的实现。
C++
// C++ program to print all palindromic partitions of a given string
#include
using namespace std;
// A utility function to check if str is palindroem
bool isPalindrome(string str, int low, int high)
{
while (low < high)
{
if (str[low] != str[high])
return false;
low++;
high--;
}
return true;
}
// Recursive function to find all palindromic partitions of str[start..n-1]
// allPart --> A vector of vector of strings. Every vector inside it stores
// a partition
// currPart --> A vector of strings to store current partition
void allPalPartUtil(vector >&allPart, vector &currPart,
int start, int n, string str)
{
// If 'start' has reached len
if (start >= n)
{
allPart.push_back(currPart);
return;
}
// Pick all possible ending points for substrings
for (int i=start; i > allPart;
// To store current palindromic partition
vector currPart;
// Call recursive function to generate all partiions
// and store in allPart
allPalPartUtil(allPart, currPart, 0, n, str);
// Print all partitions generated by above call
for (int i=0; i< allPart.size(); i++ )
{
for (int j=0; j
Java
// Java program to print all palindromic
// partitions of a given string
import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
public class PrintAllPalindrome
{
// Driver program
public static void main(String[] args)
{
String input = "nitin";
System.out.println("All possible palindrome" +
"partions for " + input
+ " are :");
allPalPartitions(input);
}
// Function to print all possible
// palindromic partitions of str.
// It mainly creates vectors and
// calls allPalPartUtil()
private static void allPalPartitions(String input)
{
int n = input.length();
// To Store all palindromic partitions
ArrayList> allPart = new ArrayList<>();
// To store current palindromic partition
Deque currPart = new LinkedList();
// Call recursive function to generate
// all partiions and store in allPart
allPalPartitonsUtil(allPart, currPart, 0, n, input);
// Print all partitions generated by above call
for (int i = 0; i < allPart.size(); i++)
{
for (int j = 0; j < allPart.get(i).size(); j++)
{
System.out.print(allPart.get(i).get(j) + " ");
}
System.out.println();
}
}
// Recursive function to find all palindromic
// partitions of input[start..n-1] allPart --> A
// ArrayList of Deque of strings. Every Deque
// inside it stores a partition currPart --> A
// Deque of strings to store current partition
private static void allPalPartitonsUtil(ArrayList> allPart,
Deque currPart, int start, int n, String input)
{
// If 'start' has reached len
if (start >= n)
{
allPart.add(new ArrayList<>(currPart));
return;
}
// Pick all possible ending points for substrings
for (int i = start; i < n; i++)
{
// If substring str[start..i] is palindrome
if (isPalindrome(input, start, i))
{
// Add the substring to result
currPart.addLast(input.substring(start, i + 1));
// Recur for remaining remaining substring
allPalPartitonsUtil(allPart, currPart, i + 1, n, input);
// Remove substring str[start..i] from current
// partition
currPart.removeLast();
}
}
}
// A utility function to check
// if input is Palindrome
private static boolean isPalindrome(String input,
int start, int i)
{
while (start < i)
{
if (input.charAt(start++) != input.charAt(i--))
return false;
}
return true;
}
}
// This code is contributed by Prerna Saini
Python3
# Python3 program to print all
# palindromic partitions of a given string
# A utility function to check if
# str is palindrome
def isPalindrome(string: str,
low: int, high: int):
while low < high:
if string[low] != string[high]:
return False
low += 1
high -= 1
return True
# Recursive function to find all
# palindromic partitions of str[start..n-1]
# allPart --> A vector of vector of strings.
# Every vector inside it stores a partition
# currPart --> A vector of strings to store current partition
def allPalPartUtil(allPart: list, currPart: list,
start: int, n: int, string: str):
# If 'start' has reached len
if start >= n:
# In Python list are passed by reference
# that is why it is needed to copy first
# and then append
x = currPart.copy()
allPart.append(x)
return
# Pick all possible ending points for substrings
for i in range(start, n):
# If substring str[start..i] is palindrome
if isPalindrome(string, start, i):
# Add the substring to result
currPart.append(string[start:i + 1])
# Recur for remaining remaining substring
allPalPartUtil(allPart, currPart,
i + 1, n, string)
# Remove substring str[start..i]
# from current partition
currPart.pop()
# Function to print all possible
# palindromic partitions of str.
# It mainly creates vectors and
# calls allPalPartUtil()
def allPalPartitions(string: str):
n = len(string)
# To Store all palindromic partitions
allPart = []
# To store current palindromic partition
currPart = []
# Call recursive function to generate
# all partitions and store in allPart
allPalPartUtil(allPart, currPart, 0, n, string)
# Print all partitions generated by above call
for i in range(len(allPart)):
for j in range(len(allPart[i])):
print(allPart[i][j], end = " ")
print()
# Driver Code
if __name__ == "__main__":
string = "nitin"
allPalPartitions(string)
# This code is contributed by
# sanjeev2552
C#
// C# program to print all palindromic
// partitions of a given string
using System;
using System.Collections.Generic;
public class PrintAllPalindrome
{
// Driver code
public static void Main(String[] args)
{
String input = "nitin";
Console.WriteLine("All possible palindrome" +
"partions for " + input
+ " are :");
allPalPartitions(input);
}
// Function to print all possible
// palindromic partitions of str.
// It mainly creates vectors and
// calls allPalPartUtil()
private static void allPalPartitions(String input)
{
int n = input.Length;
// To Store all palindromic partitions
List> allPart = new List>();
// To store current palindromic partition
List currPart = new List();
// Call recursive function to generate
// all partiions and store in allPart
allPalPartitonsUtil(allPart, currPart, 0, n, input);
// Print all partitions generated by above call
for (int i = 0; i < allPart.Count; i++)
{
for (int j = 0; j < allPart[i].Count; j++)
{
Console.Write(allPart[i][j] + " ");
}
Console.WriteLine();
}
}
// Recursive function to find all palindromic
// partitions of input[start..n-1] allPart --> A
// List of Deque of strings. Every Deque
// inside it stores a partition currPart --> A
// Deque of strings to store current partition
private static void allPalPartitonsUtil(List> allPart,
List currPart, int start, int n, String input)
{
// If 'start' has reached len
if (start >= n)
{
allPart.Add(new List(currPart));
return;
}
// Pick all possible ending points for substrings
for (int i = start; i < n; i++)
{
// If substring str[start..i] is palindrome
if (isPalindrome(input, start, i))
{
// Add the substring to result
currPart.Add(input.Substring(start, i + 1 - start));
// Recur for remaining remaining substring
allPalPartitonsUtil(allPart, currPart, i + 1, n, input);
// Remove substring str[start..i] from current
// partition
currPart.RemoveAt(currPart.Count - 1);
}
}
}
// A utility function to check
// if input is Palindrome
private static bool isPalindrome(String input,
int start, int i)
{
while (start < i)
{
if (input[start++] != input[i--])
return false;
}
return true;
}
}
// This code is contributed by PrinciRaj1992
输出:
n i t i n
n iti n
nitin