查找S的非空子字符串中值最大的偶数整数


在这个问题中,我们需要找到给定字符串中值最大的偶数子字符串。偶数字符串的末尾总是包含2、4、6、8、0。因此,我们可以取给定字符串的所有子字符串,如果任何子字符串是偶数且大于最大子字符串,我们可以更新最大子字符串的值。

问题陈述 – 我们给定一个仅包含数字的字符串str。我们需要找到str的最大子字符串,该子字符串是一个偶数整数。

示例

输入

str = "1234789"

输出

123478

解释 – 最大的偶数子字符串是123478。

输入

str = ‘3208’

输出

3208

解释 – 字符串本身就是偶数。所以,它打印字符串本身。

输入

str = "13579";

输出

‘Not Possible’

解释 – 字符串不包含任何偶数子字符串。所以,它打印了“不可能”。

方法一

在这种方法中,我们将遍历给定字符串的所有子字符串。如果子字符串的最后一个字符能被2整除,则表示该字符串是偶数。之后,我们将检查当前字符串是否大于最大字符串。如果是,则替换最大字符串。

算法

步骤1 – 用空字符串初始化“largeEven”字符串。

步骤2 – 使用for循环从第0个索引开始遍历字符串。在循环内,初始化“temp”字符串并使用嵌套循环从pth索引开始遍历字符串。

步骤3 – 从索引中取字符并将其附加到“temp”字符串。

步骤4 – 如果字符串的最后一个字符能被2整除,则执行getMaxStr()函数以查找最大字符串并将它的返回值存储到largeEven字符串。

步骤4.1 – 在getMaxStr()函数中,如果第一个字符串的长度大于第二个字符串的长度,则返回第一个字符串。否则,返回第二个字符串。

步骤4.2 – 如果两个字符串的长度相同,则使用循环开始匹配字符串的所有字符。

步骤4.3 – 如果第一个字符串中pth索引处的字符更大,则返回第一个字符串。否则,返回第二个字符串。如果相同索引处的字符相同,则继续进行下一次迭代。

步骤5 – 返回“largeEven”字符串。

示例

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

string getMaxStr(string num1, string num2) {
    // Comparing the size of both strings
    if (num1.length() > num2.length()){
        return num1;
    } else if (num1.length() < num2.length()) {
        return num2;
    }
    // For the same length of strings
    for (int p = 0; p < num1.length(); ++p) {
        if (num1[p] > num2[p])
            return num1;
        else if (num1[p] < num2[p])
            return num2;
    }
    // If strings are equal
    return num1;
}
string findStr(string str) {
    // string size
    int len = str.size();
    string largeEven = "";
    // get all substrings of the string
    for (int p = 0; p < len; p++) {
        string temp = "";
        for (int q = p; q < len; q++) {
            temp += str[q];
            int tempLen = temp.size();
            // check if the substring is even
            if ((temp[tempLen - 1] - '0') % 2 == 0)
            {
                // Get maximum string
                largeEven = getMaxStr(largeEven, temp);
            }
        }
    }
    return largeEven;
}
int main() {
    string str = "1234789";
    string result = findStr(str);
    if (result == ""){
        cout << "Not possible";
    } else {
        cout << "The largest possible even number is " << result << "\n";
    }
    return 0;
}

输出

The largest possible even number is 123478

时间复杂度 – O(N*N),因为我们得到了给定字符串的所有子字符串。

空间复杂度 – O(N) 用于存储子字符串。

方法二

在这种方法中,我们将从最后遍历字符串并找到偶数数字的第一次出现。我们可以将从第0个索引到当前数字的子字符串作为字符串的最后一位数字将是偶数。

算法

步骤1 – 用-1初始化“index”变量以存储从最后开始的第一个偶数数字的索引。

步骤2 – 从最后遍历字符串。

步骤3 – 如果当前数字能被2整除,则将“index”变量的值更新为“I”并中断循环。

步骤4 – 如果index的值为-1,则返回空字符串,因为字符串仅包含奇数数字。否则,返回从第0个索引开始且长度等于“index + 1”的子字符串。

示例

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

string findStr(string str) {
    int len = str.length();
    int index = -1;
    // Traverse string from right to left
    for (int i = len - 1; i >= 0; i--) {
        // Getting the first even digit from the right
        if ((str[i] - '0') % 2 == 0) {
            index = i;
            break;
        }
    }
    if (index == -1)
        return "";
    else
        return str.substr(0, index + 1);
}
int main(){
    string str = "1234879";
    string result = findStr(str);
    if (result == "") {
        cout << "Not possible";
    } else {
        cout << "The largest possible even number is " << result << "\n";
    }
    return 0;
}

输出

The largest possible even number is 12348

时间复杂度 – O(N) 用于反向遍历字符串或获取子字符串。

空间复杂度 – O(1),因为我们没有使用额外的空间。

第一种方法是朴素的方法,第二种方法是优化的。在第二种方法中,我们使用了偶数字符串的最后一位数字能被2整除的逻辑,并且当我们从最后遍历时,我们可以得到长度最大的子字符串。

更新于:2023年8月25日

浏览量:119

开启你的职业生涯

完成课程获得认证

开始学习
广告