📜  打印字符串的所有回文分区

📅  最后修改于: 2021-05-07 09:36:37             🧑  作者: Mango

给定一个字符串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开始的所有子串是否回文。如果找到,我们将递归地解决剩余字符串的问题,并将其添加到我们的解决方案中。

以下是解决方案-

  1. 我们将维护一个用于存储所有可能分区的二维向量,并用于存储当前分区的临时向量,这是用于检查分区的字符串的新起始索引,因为我们已经在该索引之前检查了分区。
  2. 现在继续对字符串进一步的迭代,并检查它是否是回文。
  3. 如果是回文,则将此字符串添加到当前分区向量中。如果此新字符串不是字符串的结尾,则对其进行递归。再次返回后,将当前分区向量更改为旧分区向量,因为在递归步骤中可能已更改了该分区向量。
  4. 如果我们在迭代时到达字符串的末尾,则比在临时向量中有分区要多,因此我们将其添加到结果中。

要检查它是否是回文,请通过使用两个指针对字符串进行迭代。初始化第一个字符串的开头和结尾。如果两个字符相同,则增加第一个字符,减少最后一个指针,并不断迭代,直到第一个小于最后一个。

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(回文分割)