搜尋
首頁後端開發C++計算將字串分割為以偶數開頭且最小長度為M的K個子字串的方法數

計算將字串分割為以偶數開頭且最小長度為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中文網其他相關文章!

陳述
本文轉載於:tutorialspoint。如有侵權,請聯絡admin@php.cn刪除
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++中实现解决方案。问题陈述给定一个字符串,将字符串分割为尽可能多的子字符串,使得字符串中的每个字符只出现在一个子字符串中。返回这些最大化分割的长度。天真的方法天真的方法是通过字符串迭代,记录每个字符的最后出现位置。然后,再次迭代字符串,并在找到当前字符的最后出现位置时创建分区。算法(朴素)初始化一个数组以存储字符串中

检查一个字符串是否可以被分割成三个子字符串,其中一个子字符串是另外两个子字符串的子串检查一个字符串是否可以被分割成三个子字符串,其中一个子字符串是另外两个子字符串的子串Sep 22, 2023 am 11:53 AM

在这个问题中,我们需要分割给定的字符串,使得第三个子字符串可以是前两个子字符串的子字符串。让我们想想解决办法。仅当前两个字符串包含第三个字符串的所有字符时,第三个字符串才可以是前两个字符串的子字符串。所以,我们需要在给定的字符串中找到至少一个出现频率大于3的字符,并且我们可以取该单个字符的第三个子串。问题陈述-我们给出了一个包含N个小写字母字符的字符串str。我们需要检查是否可以将字符串拆分为三个子字符串a、b和c,使得子字符串c是a和b的子字符串。根据是否能找到3个子串,打印“yes”或“no

计算将字符串分割为以偶数开头且最小长度为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

PHP字符串函数实例:字符串分割PHP字符串函数实例:字符串分割Jun 20, 2023 pm 01:58 PM

PHP中有许多字符串函数,其中字符串分割函数是非常常用的。字符串分割函数可以将一个字符串按照指定的分隔符进行分割,并返回一个数组。下面我们就来介绍几个常用的字符串分割函数。explode函数explode函数可以将字符串按照指定的分隔符进行分割,并返回一个数组。其语法如下:explode(string$separator,string$string

如何在PHP中将字符串分割为数组如何在PHP中将字符串分割为数组Jul 08, 2023 pm 01:49 PM

如何在PHP中将字符串分割为数组在PHP中,我们经常需要处理字符串,并将其拆分为多个部分。将字符串分割为数组是一种常见的操作,可以帮助我们更好地处理字符串的各个部分。在本文中,我们将学习如何使用PHP中的函数将字符串分割为数组,并提供一些代码示例。使用explode函数将字符串分割为数组PHP提供了一个名为explode的函数,可以将字符串按照指定的分隔符进

解决PHP中explode函数报错的方法解决PHP中explode函数报错的方法Mar 11, 2024 am 11:45 AM

解决PHP中explode函数报错的方法,需要具体代码示例在PHP中,explode函数是用于将字符串按照指定的分隔符拆分成数组的函数。然而,有时候在使用explode函数时会出现报错的情况,主要是因为传入的参数不符合函数的要求所导致的。下面我们将针对可能出现的问题和解决方法进行详细讨论,并且提供具体的代码示例。参数个数错误导致的报错当使用explode函数

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

在PHP语言中,有很多基础函数可以帮我们快速有效地处理字符串。其中,explode函数是一个很实用的字符串分割函数。它可以将一个字符串按照指定的分割符分割成数组,进而进行更为灵活的字符串操作。在本文中,我们将会介绍PHP中如何使用explode函数来分割字符串。一、explode函数格式explode函数在PHP语言中的格式如下:explode(separa

See all articles

熱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.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),