📌  相关文章
📜  检查是否可以通过串联两个给定字符串的子字符串来形成回文字符串

📅  最后修改于: 2021-04-24 03:46:10             🧑  作者: Mango

给定两个字符串str1str2 ,任务是检查是否可以通过将str1str2的两个子字符串串联来形成回文字符串。

例子:

天真的方法:
解决问题的最简单方法是生成str1str2的每个可能的子字符串,并将它们组合以生成所有可能的串联。对于每个串联,请检查其是否回文。如果发现是真的,则打印“是” 。否则,打印“否”

时间复杂度: O(N 2 * M 2 *(N + M)),其中N和M分别是str1和str2的长度。
辅助空间: O(1)

高效方法:
为了优化上述方法,需要进行以下观察:

请按照以下步骤解决问题:

  • 初始化一个布尔数组,以标记两个字符串中每个字母的存在。
  • 遍历str1并将索引(str1 [i] –’a’)标记为true。
  • 现在,遍历str2并检查是否已将任何索引(str2 [i]-‘a’)标记为true ,然后输出“ Yes”
  • 完全遍历str2之后,如果找不到公共字符,则打印“ No”。

下面是上述方法的实现:

C++
// C++ Program to implement 
// the above approach 
#include  
using namespace std; 
  
// Function to check if a palindromic 
// string can be formed from the 
// substring of given strings 
bool check(string str1, string str2) 
{ 
    // Boolean array to mark 
    // presence of characters 
    vector mark(26, false); 
  
    int n = str1.size(), 
        m = str2.size(); 
  
    for (int i = 0; i < n; i++) { 
  
        mark[str1[i] - 'a'] = true; 
    } 
  
    // Check if any of the character 
    // of str2 is already marked 
    for (int i = 0; i < m; i++) { 
  
        // If a common character 
        // is found 
        if (mark[str2[i] - 'a']) 
            return true; 
    } 
  
    // If no common character 
    // is found 
    return false; 
} 
  
// Driver Code 
int main() 
{ 
  
    string str1 = "abca", 
        str2 = "efad"; 
  
    if (check(str1, str2)) 
        cout << "Yes"; 
    else
        cout << "No"; 
  
    return 0; 
}


Java
// Java program to implement 
// the above approach 
import java.util.Arrays; 
  
class GFG{ 
      
// Function to check if a palindromic 
// string can be formed from the 
// substring of given strings 
public static boolean check(String str1, 
                            String str2) 
{ 
      
    // Boolean array to mark 
    // presence of characters 
    boolean[] mark = new boolean[26]; 
    Arrays.fill(mark, false); 
      
    int n = str1.length(), 
        m = str2.length(); 
  
    for(int i = 0; i < n; i++) 
    { 
        mark[str1.charAt(i) - 'a'] = true; 
    } 
  
    // Check if any of the character 
    // of str2 is already marked 
    for(int i = 0; i < m; i++) 
    { 
  
        // If a common character 
        // is found 
        if (mark[str2.charAt(i) - 'a']) 
            return true; 
    } 
  
    // If no common character 
    // is found 
    return false; 
} 
  
// Driver code 
public static void main(String[] args) 
{ 
    String str1 = "abca", 
    str2 = "efad"; 
  
    if (check(str1, str2)) 
        System.out.println("Yes"); 
    else
        System.out.println("No"); 
} 
} 
  
// This code is contributed by divyeshrabadiya07


Python3
# Python3 program to implement 
# the above approach 
      
# Function to check if a palindromic 
# string can be formed from the 
# substring of given strings 
def check(str1, str2):
      
    # Boolean array to mark 
    # presence of characters 
    mark = [False for i in range(26)]
      
    n = len(str1)
    m = len(str2)
      
    for i in range(n):
        mark[ord(str1[i]) - ord('a')] = True
      
    # Check if any of the character 
    # of str2 is already marked 
    for i in range(m):
          
        # If a common character 
        # is found 
        if (mark[ord(str2[i]) - ord('a')]):
            return True; 
  
    # If no common character 
    # is found 
    return False
      
# Driver code
if __name__=="__main__":
      
    str1 = "abca"
    str2 = "efad"
  
    if (check(str1, str2)):
        print("Yes");
    else:
        print("No");
  
# This code is contributed by rutvik_56


C#
// C# program to implement 
// the above approach 
using System; 
  
class GFG{ 
      
// Function to check if a palindromic 
// string can be formed from the 
// substring of given strings 
public static bool check(String str1, 
                        String str2) 
{ 
      
    // Boolean array to mark 
    // presence of characters 
    bool[] mark = new bool[26]; 
      
    int n = str1.Length, 
        m = str2.Length; 
  
    for(int i = 0; i < n; i++) 
    { 
        mark[str1[i] - 'a'] = true; 
    } 
  
    // Check if any of the character 
    // of str2 is already marked 
    for(int i = 0; i < m; i++) 
    { 
  
        // If a common character 
        // is found 
        if (mark[str2[i] - 'a']) 
            return true; 
    } 
  
    // If no common character 
    // is found 
    return false; 
} 
  
// Driver code 
public static void Main(String[] args) 
{ 
    String str1 = "abca", 
    str2 = "efad"; 
  
    if (check(str1, str2)) 
        Console.WriteLine("Yes"); 
    else
        Console.WriteLine("No"); 
} 
} 
  
// This code is contributed by amal kumar choubey


输出:
Yes

时间复杂度: O(max(N,M)),其中N和M分别是str1和str2的长度。
辅助空间: O(1)