给定一个字符串s,分区s使得分区的每个字符串都是回文。返回s的所有可能的回文分区。
例子 :
Input : s = "bcc"
Output : [["b", "c", "c"], ["b", "cc"]]
Input : s = "geeks"
Output : [["g", "e", "e", "k", "s"],
["g", "ee", "k", "s"]]
我们必须列出所有可能的分区,以便我们考虑递归的方向。当我们在索引i上时,我们将逐步检查从i开始的所有子串是否回文。如果找到,我们将递归地解决剩余字符串的问题,并将其添加到我们的解决方案中。
以下是解决方案-
- 我们将维护一个用于存储所有可能分区的二维向量,并用于存储当前分区的临时向量,这是用于检查分区的字符串的新起始索引,因为我们已经在该索引之前检查了分区。
- 现在继续对字符串进一步的迭代,并检查它是否是回文。
- 如果是回文,则将此字符串添加到当前分区向量中。如果此新字符串不是字符串的结尾,则对其进行递归。再次返回后,将当前分区向量更改为旧分区向量,因为在递归步骤中可能已更改了该分区向量。
- 如果我们在迭代时到达字符串的末尾,则比在临时向量中有分区要多,因此我们将其添加到结果中。
要检查它是否是回文,请通过使用两个指针对字符串进行迭代。初始化第一个字符串的开头和结尾。如果两个字符相同,则增加第一个字符,减少最后一个指针,并不断迭代,直到第一个小于最后一个。
C++
// C++ program to print all palindromic partitions
// of a given string.
#include
using namespace std;
// Returns true if str is palindrome, else false
bool checkPalindrome(string str)
{
int len = str.length();
len--;
for (int i=0; i > partitions)
{
for (int i = 0; i < partitions.size(); ++i)
{
for(int j = 0; j < partitions[i].size(); ++j)
cout << partitions[i][j] << " ";
cout << endl;
}
return;
}
// Goes through all indexes and recursively add remaining
// partitions if current string is palindrome.
void addStrings(vector > &v, string &s,
vector &temp, int index)
{
int len = s.length();
string str;
vector current = temp;
if (index == 0)
temp.clear();
for (int i = index; i < len; ++i)
{
str = str + s[i];
if (checkPalindrome(str))
{
temp.push_back(str);
if (i+1 < len)
addStrings(v,s,temp,i+1);
else
v.push_back(temp);
temp = current;
}
}
return;
}
// Generates all palindromic partitions of 's' and
// stores the result in 'v'.
void partition(string s, vector >&v)
{
vector temp;
addStrings(v, s, temp, 0);
printSolution(v);
return;
}
// Driver code
int main()
{
string s = "geeks";
vector > partitions;
partition(s, partitions);
return 0;
}
Java
// Java program to print all palindromic partitions
// of a given string.
import java.util.ArrayList;
public class GFG
{
// Returns true if str is palindrome, else false
static boolean checkPalindrome(String str)
{
int len = str.length();
len--;
for (int i=0; i>
partitions)
{
for(ArrayList i: partitions)
{
for(String j: i)
{
System.out.print(j+" ");
}
System.out.println();
}
}
// Goes through all indexes and recursively add remaining
// partitions if current string is palindrome.
static ArrayList> addStrings(ArrayList<
ArrayList> v, String s, ArrayList temp,
int index)
{
int len = s.length();
String str = "";
ArrayList current = new ArrayList<>(temp);
if (index == 0)
temp.clear();
// Iterate over the string
for (int i = index; i < len; ++i)
{
str = str + s.charAt(i);
// check whether the substring is
// palindromic or not
if (checkPalindrome(str))
{
// if palindrome add it to temp list
temp.add(str);
if (i + 1 < len)
{
// recurr to get all the palindromic
// partitions for the substrings
v = addStrings(v,s,temp,i+1);
}
else
{
// if end of the string is reached
// add temp to v
v.add(temp);
}
// temp is reinitialize with the
// current i.
temp = new ArrayList<>(current);
}
}
return v;
}
// Generates all palindromic partitions of 's' and
// stores the result in 'v'.
static void partition(String s, ArrayList> v)
{
// temporary ArrayList to store each
// palindromic string
ArrayList temp = new ArrayList<>();
// calling addString method it adds all
// the palindromic partitions to v
v = addStrings(v, s, temp, 0);
// printing the solution
printSolution(v);
}
// Driver code
public static void main(String args[])
{
String s = "geeks";
ArrayList> partitions = new
ArrayList<>();
partition(s, partitions);
}
}
// This code is contributed by Sumit Ghosh
Python3
# Python3 program to print all palindromic
# partitions of a given string.
def checkPalindrome(string):
# Returns true if str is palindrome,
# else false
length = len(string)
length -= 1
for i in range(length):
if string[i] != string[length]:
return False
length -= 1
return True
def printSolution(partitions):
for i in range(len(partitions)):
for j in range(len(partitions[i])):
print(partitions[i][j], end = " ")
print()
def addStrings(v, s, temp, index):
# Goes through all indexes and
# recursively add remaining partitions
# if current string is palindrome.
length = len(s)
string = ""
current = temp[:]
if index == 0:
temp = []
for i in range(index, length):
string += s[i]
if checkPalindrome(string):
temp.append(string)
if i + 1 < length:
addStrings(v, s, temp[:], i + 1)
else:
v.append(temp)
temp = current
def partition(s, v):
# Generates all palindromic partitions
# of 's' and stores the result in 'v'.
temp = []
addStrings(v, s, temp[:], 0)
printSolution(v)
# Driver Code
if __name__ == "__main__":
s = "geeks"
partitions = []
partition(s, partitions)
# This code is contributed by
# vibhu4agarwal
C#
// C# program to print all palindromic partitions
// of a given string.
using System;
using System.Collections.Generic;
class GFG
{
// Returns true if str is palindrome, else false
static bool checkPalindrome(String str)
{
int len = str.Length;
len--;
for (int i = 0; i < len; i++)
{
if (str[i] != str[len])
return false;
len--;
}
return true;
}
// Prints the partition list
static void printSolution(List>
partitions)
{
foreach(List i in partitions)
{
foreach(String j in i)
{
Console.Write(j+" ");
}
Console.WriteLine();
}
}
// Goes through all indexes and recursively add remaining
// partitions if current string is palindrome.
static List> addStrings(List<
List> v, String s, List temp,
int index)
{
int len = s.Length;
String str = "";
List current = new List(temp);
if (index == 0)
temp.Clear();
// Iterate over the string
for (int i = index; i < len; ++i)
{
str = str + s[i];
// check whether the substring is
// palindromic or not
if (checkPalindrome(str))
{
// if palindrome add it to temp list
temp.Add(str);
if (i + 1 < len)
{
// recurr to get all the palindromic
// partitions for the substrings
v = addStrings(v,s,temp,i+1);
}
else
{
// if end of the string is reached
// add temp to v
v.Add(temp);
}
// temp is reinitialize with the
// current i.
temp = new List(current);
}
}
return v;
}
// Generates all palindromic partitions of 's' and
// stores the result in 'v'.
static void partition(String s, List> v)
{
// temporary List to store each
// palindromic string
List temp = new List();
// calling addString method it adds all
// the palindromic partitions to v
v = addStrings(v, s, temp, 0);
// printing the solution
printSolution(v);
}
// Driver code
public static void Main(String []args)
{
String s = "geeks";
List> partitions = new
List>();
partition(s, partitions);
}
}
// This code is contributed by PrinciRaj1992
输出 :
g e e k s
g ee k s
相关文章:
动态编程|一组17(回文分割)