使給定字串中不存在長度超過 1 的迴文子串所需的最小替換次數


在本文中,我們將深入探討一個有趣的字串操作問題:“使給定字串中不存在長度超過 1 的迴文子串所需的最小替換次數”。這個問題挑戰我們計算需要進行的最小字元替換次數,以確保給定字串不包含長度超過 1 的迴文子串。我們將解釋這個問題,並透過示例闡明概念。

理解問題陳述

我們得到一個字串,我們的任務是確定需要進行的最小字元替換次數,以確保該字串不包含任何長度超過 1 個字元的迴文子串。迴文子串是指正讀和反讀都一樣的子串。

方法

我們採用一種簡單的方法來解決這個問題。我們遍歷字串,每次遇到與前一個字元相同的字元時,我們進行替換並遞增計數器。在替換字元時,我們確保新字元與字串中的下一個字元不同,以避免建立新的迴文子串。

示例

讓我們在各種程式語言中實現上述方法 -

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

int minReplacements(char* s) {
   int count = 0;
   int length = strlen(s);
   for (int i = 1; i < length; i++) {
      if (s[i] == s[i-1]) {
         count++;
         char newChar = 'a';
         while (newChar == s[i-1] || (i+1 < length && newChar == s[i+1])) {
            newChar++;
         }
         s[i] = newChar;
      }
   }
   return count;
}
int main(){
   char s[] = "aaabbbaaa";
   printf("Minimum replacements: %d", minReplacements(s));
   return 0;
}

輸出

Minimum replacements: 3
#include<bits/stdc++.h>
using namespace std;

int minReplacements(string s) {
   int count = 0;
   for (int i = 1; i < s.length(); i++) {
      if (s[i] == s[i-1]) {
         count++;
         char newChar = 'a';
         while (newChar == s[i-1] || (i+1 < s.length() && newChar == s[i+1])) {
            newChar++;
         }
         s[i] = newChar;
      }
   }
   return count;
}

int main() {
   string s = "aaabbbaaa";
   cout << "Minimum replacements: " << minReplacements(s);
   return 0;
}

輸出

Minimum replacements: 3
public class Main {
   public static int minReplacements(String s) {
      int count = 0;
      int length = s.length();
      char[] chars = s.toCharArray();
      for (int i = 1; i < length; i++) {
         if (chars[i] == chars[i - 1]) {
            count++;
            char newChar = 'a';
            while (newChar == chars[i - 1] || (i + 1 < length && newChar == chars[i + 1])) {
               newChar++;
            }
            chars[i] = newChar;
         }
      }
      return count;
   }

   public static void main(String[] args) {
      String s = "aaabbbaaa";
      System.out.println("Minimum replacements: " + minReplacements(s));
   }
}

輸出

Minimum replacements: 3
def min_replacements(s):
   count = 0
   length = len(s)
   for i in range(1, length):
      if s[i] == s[i - 1]:
         count += 1
         new_char = 'a'
         while new_char == s[i - 1] or (i + 1 < length and new_char == s[i + 1]): new_char = chr(ord(new_char) + 1)
         s[i] = new_char
   return count


s = "aaabbbaaa"
print("Minimum replacements:", min_replacements(list(s)))

輸出

Minimum replacements: 3

測試用例

考慮字串“aaabbbaaa”。所需的最小替換次數為 3。第二個“aa”中的第一個“a”,'bbb'中的第二個'b',以及第三個“aaa”中的第一個“a”需要被替換,以確保字串中不存在長度超過 1 的迴文子串。因此,程式碼的輸出將是:“最小替換次數:3”。

結論

在本文中,我們探討了最小化替換以避免長度超過 1 的迴文子串的問題。雖然這個問題乍一看似乎很複雜,但當以有條理的方式處理時,它會變得簡單。我們討論了一種解決該問題的實用策略,並透過一個真實的例子解釋了該概念。

更新於: 2023年10月27日

86 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.