查找给定字符串的所有回文子字符串|设置 2
给定一个字符串,任务是从给定字符串。
在 Set – 1 中,已经讨论了另一种方法,该方法仅考虑不同的子字符串,但在此相等的子字符串中,即 ll 和 ll 被视为两个子字符串,而不是一个。
例子:
Input : hellolle
Output : 13
[h, e, l, ll, l, o, lol, lloll, ellolle, l, ll, l, e]
Explanation:
1) ellolle
2) ll, ll – Note that these are two distinct sub-strings that only happen to be equal
3) lol and lloll
4) And, of course, each letter can be considered a palindrome – all 8 of them.
Input : geeksforgeeks
Output : 15
[g, e, ee, e, k, s, f, o, r, g, e, ee, e, k, s]
方法:
1-我们可以有两种类型的回文字符串需要处理 -Even Length -Odd Length
2-想法是考虑一个中点,并通过一次增加一个距离或回文半径来比较左侧的元素和右侧的元素,直到出现不匹配,从而继续检查回文字符串。
3- 该算法一次处理偶数和奇数长度的回文场景。
4-枢轴从0开始并以0.5的步长移动到结束。
…….a)当枢轴是非小数值时,回文半径值是从 0 开始的整数。
…….b)当枢轴是小数值时,回文半径值就像 0.5, 1.5, 2.5, 3.5 ..
5-所以,每次我们得到一个回文匹配,我们把它放在一个列表中(这样重复的值就会被保留,因为每个重复的子字符串都是通过不同的字母位置组合获得的)
C++
// c++ program to Count number of ways we
// can get palindrome string from a given
// string
#include
using namespace std;
// function to find the substring of the
// string
string substring(string s,int a,int b)
{
string s1="";
// extract the specified position of
// the string
for(int i = a; i < b; i++)
s1 = s1 + s[i];
return s1;
}
// can get palindrome string from a
// given string
vector allPalindromeSubstring(string s)
{
vector v ;
// moving the pivot from starting till
// end of the string
for (float pivot = 0; pivot < s.length();
pivot += .5)
{
// set radius to the first nearest
// element on left and right
float palindromeRadius = pivot -
(int)pivot;
// if the position needs to be
// compared has an element and the
// characters at left and right
// matches
while ((pivot + palindromeRadius)
< s.length() && (pivot - palindromeRadius)
>= 0 && s[((int)(pivot - palindromeRadius))]
== s[((int)(pivot + palindromeRadius))])
{
v.push_back(substring(s,(int)(pivot -
palindromeRadius), (int)(pivot
+ palindromeRadius + 1)));
// increasing the radius by 1 to point
// to the next elements in left and right
palindromeRadius++;
}
}
return v;
}
// Driver code
int main()
{
vector v =
allPalindromeSubstring("hellolle");
cout << v.size() << endl;
for(int i = 0; i < v.size(); i++)
cout << v[i] << ",";
cout << endl;
v = allPalindromeSubstring("geeksforgeeks");
cout << v.size() << endl;
for(int i = 0; i < v.size(); i++)
cout << v[i] << ",";
}
// This code is contributed by Arnab Kundu.
Java
// Java program to Count number of ways we
// can get palindrome string from a given string
import java.util.ArrayList;
import java.util.List;
public class AllPalindromeSubstringsPossible {
public static List allPalindromeSubstring(String s)
{
List list = new ArrayList();
// moving the pivot from starting till end of the string
for (float pivot = 0; pivot < s.length(); pivot += .5) {
// set radius to the first nearest element
// on left and right
float palindromeRadius = pivot - (int)pivot;
// if the position needs to be compared has an element
// and the characters at left and right matches
while ((pivot + palindromeRadius) < s.length()
&& (pivot - palindromeRadius) >= 0
&& s.charAt((int)(pivot - palindromeRadius))
== s.charAt((int)(pivot + palindromeRadius))) {
list.add(s.substring((int)(pivot - palindromeRadius),
(int)(pivot + palindromeRadius + 1)));
// increasing the radius by 1 to point to the
// next elements in left and right
palindromeRadius++;
}
}
return list;
}
// Drivers code
public static void main(String[] args)
{
List list = allPalindromeSubstring("hellolle");
System.out.println(list.size());
System.out.println(list);
list = allPalindromeSubstring("geeksforgeeks");
System.out.println(list.size());
System.out.println(list);
}
}
Python3
# Python3 program to Count number of ways we
# can get palindrome string from a given
# string
# function to find the substring of the
# string
def substring(s, a, b):
s1 = ""
# extract the specified position of
# the string
for i in range(a, b, 1):
s1 += s[i]
return s1
# can get palindrome string from a
# given string
def allPalindromeSubstring(s):
v = []
# moving the pivot from starting till
# end of the string
pivot = 0.0
while pivot < len(s):
# set radius to the first nearest
# element on left and right
palindromeRadius = pivot - int(pivot)
# if the position needs to be
# compared has an element and the
# characters at left and right
# matches
while ((pivot + palindromeRadius) < len(s) and
(pivot - palindromeRadius) >= 0 and
(s[int(pivot - palindromeRadius)] ==
s[int(pivot + palindromeRadius)])):
v.append(s[int(pivot - palindromeRadius):
int(pivot + palindromeRadius + 1)])
# increasing the radius by 1 to point
# to the next elements in left and right
palindromeRadius += 1
pivot += 0.5
return v
# Driver Code
if __name__ == "__main__":
v = allPalindromeSubstring("hellolle")
print(len(v))
print(v)
v = allPalindromeSubstring("geeksforgeeks")
print(len(v))
print(v)
# This code is contributed by
# sanjeev2552
C#
// C# program to Count number of ways we
// can get palindrome string from a given string
using System;
using System.Collections.Generic;
public class AllPalindromeSubstringsPossible
{
public static List allPalindromeSubstring(String s)
{
List list = new List();
// moving the pivot from starting till end of the string
for (float pivot = 0; pivot < s.Length; pivot+= (float).5)
{
// set radius to the first nearest element
// on left and right
float palindromeRadius = pivot - (int)pivot;
// if the position needs to be compared has an element
// and the characters at left and right matches
while ((pivot + palindromeRadius) < s.Length
&& (pivot - palindromeRadius) >= 0
&& s[(int)(pivot - palindromeRadius)]
== s[(int)(pivot + palindromeRadius)])
{
list.Add(s.Substring((int)(pivot - palindromeRadius),
(int)(pivot + palindromeRadius + 1)-
(int)(pivot - palindromeRadius)));
// increasing the radius by 1 to point to the
// next elements in left and right
palindromeRadius++;
}
}
return list;
}
// Drivers code
public static void Main(String[] args)
{
List list = allPalindromeSubstring("hellolle");
Console.WriteLine(list.Count);
for(int i = 0; i < list.Count; i++)
Console.Write(list[i]+",");
list = allPalindromeSubstring("geeksforgeeks");
Console.WriteLine("\n"+list.Count);
for(int i = 0; i < list.Count; i++)
Console.Write(list[i]+",");
}
}
/* This code contributed by PrinciRaj1992 */
Javascript
13
[h, e, l, ll, l, o, lol, lloll, ellolle, l, ll, l, e]
15
[g, e, ee, e, k, s, f, o, r, g, e, ee, e, k, s]
注意:要打印不同的子字符串,请使用 Set 因为它只需要不同的元素。