檢查三個給定字串的子串是否可以連線成迴文


迴文是計算機科學和程式設計中一個引人入勝的話題。迴文是指正讀和反讀都一樣的單詞、短語、數字或其他字元序列,忽略空格、標點符號和大小寫。在本文中,我們將研究一個獨特的問題:如何確定三個給定字串的子串是否可以連線成一個迴文。這個問題是一個常見的面試問題,可以使用多種技術來解決,包括字串操作、雜湊和動態規劃。

問題陳述

給定三個字串,任務是檢查是否可以選擇每個給定字串的子串並將它們連線起來以形成一個迴文。

方法

解決此問題的一般方法包括以下步驟:

  • 以六種不同的方式連線這三個字串(這三個字串的所有排列)。

  • 對於每個連線的字串,檢查它是否可以形成迴文。

要檢查字串是否可以形成迴文,我們需要確保字串中最多隻有一個字元的頻率為奇數。

C++解決方案

示例

以下是實現上述方法的 C++ 函式:

#include <stdio.h>
#include <stdbool.h>
#include <string.h>

// Function to check if a given string can form a palindrome
bool canFormPalindrome(const char *s) {
   int count[256] = {0};  // Array to store character frequency
   for (const char *p = s; *p != '\0'; p++) {
      count[(int)*p]++;
   }
   int odd = 0;  // Count of characters with odd frequency
   for (int i = 0; i < 256; i++) {
      if (count[i] & 1) {  // Check for odd frequency
         odd++;
      }
      if (odd > 1) {  // If more than one character has odd frequency, palindrome is not possible
         return false;
      }
   }
   return true;  // Palindrome can be formed
}

bool checkSubstrings(const char *s1, const char *s2, const char *s3) {
   const char *arr[] = {s1, s2, s3, s1, s3, s2};  // Array of strings combinations
   for (int i = 0; i < 3; i++) {
      char concatenated[16];
      strcpy(concatenated, arr[i]);
      strcat(concatenated, arr[i + 1]);
      strcat(concatenated, arr[i + 2]);
      if (canFormPalindrome(concatenated)) {
         return true;  // Palindromic substring combination found
      }
   }
   return false;  // No palindromic substring combination found
}
int main() {
   const char *s1 = "abc";
   const char *s2 = "def";
   const char *s3 = "cba";
   if (checkSubstrings(s1, s2, s3)) {
      printf("Yes\n");
   } else {
      printf("No\n");
   }
   return 0;
}

輸出

No
#include<bits/stdc++.h>
using namespace std;

bool canFormPalindrome(string str) {
   vector<int> count(256, 0);
   for (int i = 0; str[i]; i++)
      count[str[i]]++;
   int odd = 0;
   for (int i = 0; i < 256; i++) {
      if (count[i] & 1)
         odd++;
      if (odd > 1)
         return false;
   }
   return true;
}

bool checkSubstrings(string s1, string s2, string s3) {
   string arr[] = {s1, s2, s3, s1, s3, s2};
   for (int i = 0; i < 3; i++) {
      if (canFormPalindrome(arr[i] + arr[i + 1] + arr[i + 2]))
      return true;
   }
   return false;
}

int main() {
   string s1 = "abc";
   string s2 = "def";
   string s3 = "cba";
   if (checkSubstrings(s1, s2, s3))
      cout << "Yes\n";
   else
      cout << "No\n";
   return 0;
}

輸出

No
public class PalindromeSubstrings {
   public static boolean canFormPalindrome(String str) {
      int[] count = new int[256];  // Array to store character frequency
      for (char c : str.toCharArray()) {
         count[c]++;  // Count characters in the string
      }
      int odd = 0;  // Count of characters with odd frequency
      for (int c : count) {
         if ((c & 1) == 1) {  
            odd++;
         }
         if (odd > 1) {  // If more than one character has odd frequency, palindrome is not possible
            return false;
         }
      }
      return true;  
   }

   public static boolean checkSubstrings(String s1, String s2, String s3) {
      String[] arr = {s1, s2, s3, s1, s3, s2};  // Array of strings combinations
      for (int i = 0; i < 3; i++) {
         if (canFormPalindrome(arr[i] + arr[i + 1] + arr[i + 2])) {
            return true;  // Palindromic substring combination found
         }
      }
      return false;  // No palindromic substring combination found
   }

   public static void main(String[] args) {
      String s1 = "abc";
      String s2 = "def";
      String s3 = "cba";
      if (checkSubstrings(s1, s2, s3)) {
         System.out.println("Yes");
      } else {
         System.out.println("No");
      }
   }
}

輸出

No
def can_form_palindrome(s):
   count = [0] * 256  # List to store character frequency
   for c in s:
      count[ord(c)] += 1  # Count characters in the string
   odd = 0  # Count of characters with odd frequency
   for c in count:
      if c & 1:  # Check for odd frequency
         odd += 1
      if odd > 1:  # If more than one character has odd frequency, palindrome is not possible
         return False
   return True 

def check_substrings(s1, s2, s3):
   arr = [s1, s2, s3, s1, s3, s2]  # List of strings combinations
   for i in range(3):
      if can_form_palindrome(arr[i] + arr[i + 1] + arr[i + 2]):
         return True  # Palindromic substring combination found
   return False  # No palindromic substring combination found

def main():
   s1 = "abc"
   s2 = "def"
   s3 = "cba"
   if check_substrings(s1, s2, s3):
      print("Yes")
   else:
      print("No")

if __name__ == "__main__":
   main()

輸出

No

示例測試用例說明

讓我們將字串設為“abc”、“def”和“cba”。

函式canFormPalindrome(str)檢查整個字串是否可以重新排列成迴文,而不是它是否已經是迴文。

對於字串“abc”、“de”和“edcba”,連線“abcdeedcba”不能重新排列成迴文,因為有兩個“d”字元和兩個“e”字元,但只有一個“b”字元。因此,輸出確實是“No”。

函式checkSubstrings檢查三個字串所有可能的連線。但是,這些連線都不能重新排列成迴文,所以輸出是“No”。

結論

能夠解決此類問題不僅有助於在編碼面試中取得好成績,還可以增強解決問題的能力,而解決問題的能力對於每一位軟體工程師來說都是必不可少的。這個問題很好地說明了如何使用字串操作和雜湊來解決複雜問題。實踐和理解是掌握這些主題的關鍵。

更新於:2023年10月16日

194 次瀏覽

啟動你的職業生涯

透過完成課程獲得認證

開始
廣告