检查两个单词的总和是否等于目标单词

data structurec++server side programmingprogramming

在这个问题中,我们将给出三个长度相同或不同的字符串 str1、str2 和 str3,我们必须判断前两个字符串的总和是否等于第三个字符串。每个字符串都包含小于"k"的元素,这意味着"a"可以解码为"0",j 可以解码为"9",我们可以将它们的总和作为正常数字。

示例

输入 1

字符串 str1 = "abc"

字符串 str2 = "bbe"

字符串 str3 = "cdg"

输出:

解释 - 我们可以将"a"解码为"0",将"b"解码为"1",将 c 解码为"2",将 d 解码为"3",将 e 解码为"4",将 g 解码为"6"。映射解码的值后,我们将得到最终的字符串"012"、"114"和"236"。我们可以将前两个相加得到第三个值。

输入 2

字符串 str1 = "abc"

字符串 str2 = "abca"

字符串 str3 = "aceb"

输出:否

解释 - 我们可以将"a"解码为"0",将"b"解码为"1",将 c 解码为"2"。映射解码的值后,我们将得到最终的字符串"012"、"0120"和"0241"。我们不能将前两个相加来得到第三个值。

方法

我们已经看过上面的例子,现在让我们转到我们将要实现的主要方法步骤,以获得所需的结果。

  • 首先,我们将创建一个函数,该函数将返回一个指示结果的布尔值,它将接受所有三个给定字符串的参数。

  • 首先,在函数中,我们将获得所有三个字符串的长度,这将有助于使用 while 或 for 循环遍历它们。

  • 我们将反转所有给定的字符串,因为我们要添加字符串,并且当我们从最后一个添加数字时,因此要从最后一个添加字符串,我们将反转它们以简化该过程。

  • 我们将使用 while 循环遍历字符串,并创建一个变量 carry 来存储用于加法的数学进位。

  • 对于当前索引,我们将两个字符串当前索引 ASCII 值相加,并减去"a"的 ASCII 值以简化求和,然后将它们存储在进位中。

  • 对于进位变量,我们将模 10 的值加上答案字符串中的"a",然后将进位除以 10。

  • 遍历字符串后,我们将结果与第三个给定字符串进行比较,因为字符串已经反转,所以我们可以直接比较。

  • 从主函数中,我们将调用该函数并根据返回值打印结果。

示例

#include <bits/stdc++.h>
using namespace std;
bool isEqual(string str1, string str2, string str3){
    // 获取字符串的长度
    int len1 = str1.size();
    int len2 = str2.size();
    int len3 = str3.size();
    // 反转字符串
    reverse(str1.begin(),str1.end());
    reverse(str2.begin(),str2.end());
    reverse(str3.begin(),str3.end());
    // 获取前两个字符串的总和
    string ans = "";
    int carry = 0; // 存储进位的变量
    int i=0, j=0;
    while(i < len1 || j < len2){
      if(i < len1 && j < len2){
         carry += str1[i]-'a'+str2[j]-'a';
         ans += 'a'+carry%10;
         carry /= 10;
         i++;
         j++;
      }
      else if(i == len1){
         carry += str2[j]-'a';
         ans += 'a'+carry%10;
         carry /= 10;
         j++;
      }
      else{
         carry += str1[i]-'a';
         ans += 'a'+carry%10;
         carry /= 10;
         i++;
      }
   }
   if(carry){
      ans += 'b';
   }
   return ans == str3; // 根据条件返回值
}
int main(){
    // 定义给定的字符串
    string str1 = "abc";
    string str2 = "bbe";
    string str3 = "bcg";
    // 调用函数获取给定条件是否为真
    if(isEqual(str1, str2, str3)){
        cout<<"是的,给定字符串的总和等于给定的第三个字符串"<<endl;
    }
    else{
        cout<<"否,给定字符串的总和不等于给定的第三个字符串"<<endl;
    }
    return 0;
}

输出

是的,给定的字符串的总和等于给定的第三个字符串

时间和空间复杂度

上述代码的时间复杂度为 O(N),其中 N 是给定字符串的长度。由于我们只移动给定的字符串一次,并且一次移动一次,因此我们将所有字符串都反转。

上述代码的空间复杂度为 O(N),因为我们将结果存储在额外的字符串中。

结论

在上述教程中,我们实现了一个程序来查找给定的两个字符串的总和是否等于给定的第三个字符串。我们使用了 ASCII 值的概念和基本数学来添加字符串。上述代码的时间复杂度为 O(N),空间复杂度相同。


相关文章