目錄
方法一
演算法
Example
輸出
方法二
示例
输出
首頁 後端開發 C++ 計算將字串分割為以偶數開頭且最小長度為M的K個子字串的方法數

計算將字串分割為以偶數開頭且最小長度為M的K個子字串的方法數

Sep 09, 2023 pm 02:01 PM
字串分割 方法數 偶數開頭

計算將字串分割為以偶數開頭且最小長度為M的K個子字串的方法數

在這個問題中,我們將計算給定的字串分成K個子字串的方法,使其滿足問題陳述中給出的條件。

我們將使用遞歸來解決這個問題。此外,我們還將使用表格動態規劃方法來有效解決這個問題。

問題陳述 − 我們有一個名為bin_Str的特定長度的字串。該字串只包含從'0'到'9'的數字字元。我們需要計算將字串分割成K個子字串的方式數,使其滿足以下條件。

  • 子字串應至少包含2個字元。

  • 每個子字串的第一個字元應為偶數,最後一個字元應為奇數。

範例範例

輸入

M = 2, K = 2; bin_str = "255687"
登入後複製

Output

#
1
登入後複製

Explanation − 根據問題陳述的條件,我們可以將255 | 687分割成給定字串的一部分。

輸入

M = 2, K = 2; bin_str = "26862";
登入後複製

Output

#
0
登入後複製

解釋 − 由於字串只包含偶數數字,我們無法將其分割成兩個子字串,使得每個子字串以奇數數字結尾。

輸入

M = 2, K = 3; bin_str = "856549867";
登入後複製

輸出

3
登入後複製

Explanation − 可能的分割方式有85|65|49867、8565|49|867和85|6549|867。

方法一

我們將使用遞歸函數來解決這個問題。如果我們在當前索引中找到了有效的子字串,我們會進行遞歸調用,計算將剩餘子字串分成 K - 1 個子字串的方法數量。

演算法

步驟 1 − 取給定字串的第一個和最後一個字元。

步驟 2 − 如果第一個字元不是偶數,且最後一個字元不是奇數,則傳回 0。

步驟 3 − 如果起始索引等於字串長度,則傳回 0,因為我們已經到達給定字串的末端。

第4步− 如果 K == 1,則取字串長度與起始索引之間的差值。如果它等於或大於 M,則傳回 1。否則,返回 0。在這裡,如果 K 為 1,我們需要取得剩餘的子字串。

步驟5 - 將‘ops’初始化為‘0’,以儲存分割方式的計數,將‘len’初始化為‘0’,以儲存目前子字串的長度。

步驟 6 − 從「start」索引開始遍歷字串直到字串的結尾。

第7步− 將‘len’增加1。同時,取得目前字元和下一個字元。

第8步− 如果'len'大於M,且目前數字是奇數,下一個數字是偶數,我們可以在目前索引處結束分區。因此,透過將下一個索引和K - 1作為函數參數傳遞,對countWays()函數進行遞歸呼叫。

第9步− 最後,傳回‘ops’的值。

Example

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

int countWays(int start, int str_len, int K, int M, string bin_str) {
    // Geeting first and last character of the substring
    int f_char = bin_str[0] - '0';
    int l_char = bin_str[str_len - 1] - '0';
    if (f_char % 2 != 0 || l_char % 2 != 1) {
        return 0;
    }
    // When we reach at the end
    if (start == str_len)
        return 0;
    // Base case
    if (K == 1) {
        int chars = str_len - start;
        // Validate minimum length of substring
        if (chars >= M)
            return 1;
        return 0;
    }    
    int ops = 0;
    int len = 0;
    // Traverse all partions
    for (int p = start; p < str_len - 1; p++) {
        len++;
        int first = bin_str[p] - '0';
        int second = bin_str[p + 1] - '0';
        // If we can end the partition at p and start a new partition at p+1
        if (len >= M && first % 2 == 1) {
            if (second % 2 == 0) {
                ops += countWays(p + 1, str_len, K - 1, M, bin_str);
            }
        }
    }
    return ops;
}
int main() {
    int M = 2, K = 2;
    string bin_str = "255687";
    int str_len = bin_str.length();
    cout << "The number of ways to split the string is " << countWays(0, str_len, K, M, bin_str) << endl;
    return 0;
}
登入後複製

輸出

The number of ways to split the string is 1
登入後複製
登入後複製

將字串分割的方式數量為1

空間複雜度 - O(1),因為我們不使用額外的空間。

方法二

在這個方法中,我們將使用表格動態規劃技術來計算將字串分割成K個部分的方法數。我們將使用矩陣來儲存先前狀態的輸出。

演算法

步驟 1 - 定義大小為 1001 x 1001 的全域矩陣 matrix[] 陣列。矩陣的行映射到一個字串字符,矩陣的列映射到 K。

第二步 − 取字串的第一個和最後一個字元。如果第一個字元是偶數且最後一個字元是奇數,則執行countWays()函數。否則,在輸出中列印0。

步驟 3 − 在 countWays 函數中,初始化 matrix[] 陣列。

步驟 4 − 遍歷矩陣的行數等於字串長度,列數等於K。如果行數等於字串長度,則將整行更新為0。

步驟5 − 否則,如果q為1,且字串長度減去目前索引大於M,則用1初始化陣列matrix[p][q]。否則,用0初始化matrix[p][q]。

步驟 6 − 在其他情況下,將矩陣[p][q]初始化為-1。

第7步− 使用兩個巢狀迴圈填入矩陣。使用外部循環進行2到K的遍歷,使用巢狀循環進行0到字串長度的遍歷。

第8步 - 將'ops'和'len'初始化為0。此外,從第p個索引開始遍歷字串,並在每次迭代中將'len'增加1。

步驟9 − 取出字串的目前字元和下一個字元。

第10步− 如果長度大於M,當前字元是奇數,且下一個字元是偶數,則將matrix[k 1][q − 1]加到'ops'中。

第11步− 使用‘ops’更新矩陣[p][q]。

第12步− 最後回傳matrix[0][k]。

Example

的中文翻译为:

示例

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

int matrix[1001][1001];
int countWays(int str_len, int K, int M, string bin_str) {
    // Base case
    for (int p = 0; p <= str_len; p++) {
        for (int q = 0; q <= K; q++) {
            // When index points to end index of string
            if (p == str_len)
                matrix[p][q] = 0;
            else if (q == 1) {
                // When only 1 split needs to be done
                int chars = str_len - p;
                // Validating substring's minimum len
                if (chars >= M)
                    matrix[p][q] = 1;
                else
                    matrix[p][q] = 0;
            } else {
                // For other cases
                matrix[p][q] = -1;
            }
        }
    }
    // Dynamic programming approach
    for (int q = 2; q <= K; q++) {
        for (int p = 0; p < str_len; p++) {
            int ops = 0;
            int len = 0; // length of current substring
            for (int k = p; k < str_len - 1; k++) {
                len++;
                int first = bin_str[k] - '0';
                int second = bin_str[k + 1] - '0';
                // Validate condition for split
                if (len >= M && first % 2 == 1 && second % 2 == 0) {
                    // Substring starting from k + 1 index needs to be splited in q-1 parts
                    ops += matrix[k + 1][q - 1];
                }
            }
            matrix[p][q] = ops;
        }
    }
    return matrix[0][K];
}
int main() {
    int M = 2, K = 2;
    string bin_str = "255687";
    int str_len = bin_str.length();
    int f_char = bin_str[0] - '0';
    int l_char = bin_str[str_len - 1] - '0';
    cout << "The number of ways to split the string is ";
    if (f_char % 2 != 0 || l_char % 2 != 1) {
        cout << 0 << endl;
    } else {
        cout << countWays(str_len, K, M, bin_str) << endl;
    }
    return 0;
}
登入後複製

输出

The number of ways to split the string is 1
登入後複製
登入後複製

时间复杂度 - O(N*N*K),其中 O(N*N) 用于找到所有子字符串,O(K) 用于 K 个分区。

空间复杂度 - 使用matrix[]数组为O(N*K)。

以上是計算將字串分割為以偶數開頭且最小長度為M的K個子字串的方法數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Python 3.x 中如何使用split()函數將字串依照指定分隔符號分割 Python 3.x 中如何使用split()函數將字串依照指定分隔符號分割 Jul 31, 2023 pm 08:33 PM

Python是一種流行的程式語言,它提供了許多內建函數來處理字串。其中一個常用的函數是split()函數,可以依照指定的分隔符號將字串分割成多個子字串。本文將介紹如何在Python3.x中使用split()函數。在Python中,split()函數是字串類別的一個內建函數,它的基本語法如下:string.split(separator,maxsplit)

字串的最大分割長度,使得字串中的每個字元都出現在一個子字串中 字串的最大分割長度,使得字串中的每個字元都出現在一個子字串中 Aug 25, 2023 pm 02:41 PM

在本文中,我們將探討如何找到具有唯一字元的字串的最大化分區的長度問題。我們首先了解問題陳述,然後研究解決這個問題的樸素和高效方法,包括它們各自的演算法和時間複雜度。最後,我們將在C++中實作解決方案。問題陳述給定一個字串,將字串分割為盡可能多的子字串,使得字串中的每個字元只出現在一個子字串中。傳回這些最大化分割的長度。天真的方法天真的方法是透過字串迭代,記錄每個字元的最後出現位置。然後,再次迭代字串,並在找到當前字元的最後出現位置時建立分區。演算法(樸素)初始化一個陣列以儲存字串中

PHP中如何使用explode函數分割字串 PHP中如何使用explode函數分割字串 Jun 26, 2023 pm 12:03 PM

在PHP語言中,有許多基礎函數可以幫助我們快速有效地處理字串。其中,explode函數是一個很實用的字串分割函數。它可以將一個字串依照指定的分割符分割成數組,進而進行更靈活的字串操作。在本文中,我們將會介紹PHP中如何使用explode函數來分割字串。一、explode函數格式explode函數在PHP語言的格式如下:explode(separa

如何在PHP中將字串分割為數組 如何在PHP中將字串分割為數組 Jul 08, 2023 pm 01:49 PM

如何在PHP中將字串分割為陣列在PHP中,我們經常需要處理字串,並將其拆分為多個部分。將字串分割為陣列是一種常見的操作,可以幫助我們更好地處理字串的各個部分。在本文中,我們將學習如何使用PHP中的函數將字串分割為數組,並提供一些程式碼範例。使用explode函數將字串分割成陣列PHP提供了一個名為explode的函數,可以將字串依照指定的分隔符號進

PHP字串函數實例:字串分割 PHP字串函數實例:字串分割 Jun 20, 2023 pm 01:58 PM

PHP中有許多字串函數,其中字串分割函數是非常常用的。字串分割函數可以將字串依照指定的分隔符號分割,並傳回一個陣列。下面我們就來介紹幾個常用的字串分割函數。 explode函數explode函數可以將字串依照指定的分隔符號分割,並傳回一個陣列。其語法如下:explode(string$separator,string$string

解PHP中explode函數報錯的方法 解PHP中explode函數報錯的方法 Mar 11, 2024 am 11:45 AM

解決PHP中explode函數報錯的方法,需要具體程式碼範例在PHP中,explode函數是用來將字串依照指定的分隔符號拆分成數組的函數。然而,有時在使用explode函數時會出現報錯的情況,主要是因為傳入的參數不符合函數的要求所導致的。以下我們將針對可能出現的問題和解決方法進行詳細討論,並提供具體的程式碼範例。參數個數錯誤導致的錯誤當使用explode函數

計算將字串分割為以偶數開頭且最小長度為M的K個子字串的方法數 計算將字串分割為以偶數開頭且最小長度為M的K個子字串的方法數 Sep 09, 2023 pm 02:01 PM

在這個問題中,我們將計算將給定的字串劃分為K個子字串的方法,使其滿足問題陳述中給出的條件。我們將使用遞歸來解決這個問題。此外,我們還將使用表格動態規劃方法來有效解決這個問題。問題陳述−我們有一個名為bin_Str的特定長度的字串。該字串只包含從'0'到'9'的數字字元。我們需要計算將字串分割成K個子字串的方式數,使其滿足以下條件。子字串應至少包含2個字元。每個子字串的第一個字元應為偶數,最後一個字元應為奇數。範例範例輸入M=2,K=2;bin_str="255687&q

檢查一個字串是否可以分割成三個子字串,其中一個子字串是另外兩個子字串的子字串 檢查一個字串是否可以分割成三個子字串,其中一個子字串是另外兩個子字串的子字串 Sep 22, 2023 am 11:53 AM

在這個問題中,我們需要分割給定的字串,使得第三個子字串可以是前兩個子字串的子字串。讓我們想想解決辦法。僅當兩個字串包含第三個字串的所有字元時,第三個字串才可以是前兩個字串的子字串。所以,我們需要在給定的字串中找到至少一個出現頻率大於3的字符,並且我們可以取該單一字符的第三個子串。問題陳述-我們給了一個包含N個小寫字母字元的字串str。我們需要檢查是否可以將字串拆分為三個子字串a、b和c,使得子字串c是a和b的子字串。根據是否能找到3個子串,印出“yes”或“no

See all articles