carloscn / structstudy

Leetcode daily trainning by using C/C++/RUST programming.
4 stars 1 forks source link

leetcode1880: Check if Word Equals Summation of Two Words #301

Open carloscn opened 1 year ago

carloscn commented 1 year ago

Description

The letter value of a letter is its position in the alphabet starting from 0 (i.e. 'a' -> 0, 'b' -> 1, 'c' -> 2, etc.).

The numerical value of some string of lowercase English letters s is the concatenation of the letter values of each letter in s, which is then converted into an integer.

For example, if s = "acb", we concatenate each letter's letter value, resulting in "021". After converting it, we get 21. You are given three strings firstWord, secondWord, and targetWord, each consisting of lowercase English letters 'a' through 'j' inclusive.

Return true if the summation of the numerical values of firstWord and secondWord equals the numerical value of targetWord, or false otherwise.

Example 1:

Input: firstWord = "acb", secondWord = "cba", targetWord = "cdb" Output: true Explanation: The numerical value of firstWord is "acb" -> "021" -> 21. The numerical value of secondWord is "cba" -> "210" -> 210. The numerical value of targetWord is "cdb" -> "231" -> 231. We return true because 21 + 210 == 231.

Example 2:

Input: firstWord = "aaa", secondWord = "a", targetWord = "aab" Output: false Explanation: The numerical value of firstWord is "aaa" -> "000" -> 0. The numerical value of secondWord is "a" -> "0" -> 0. The numerical value of targetWord is "aab" -> "001" -> 1. We return false because 0 + 0 != 1.

Example 3:

Input: firstWord = "aaa", secondWord = "a", targetWord = "aaaa" Output: true Explanation: The numerical value of firstWord is "aaa" -> "000" -> 0. The numerical value of secondWord is "a" -> "0" -> 0. The numerical value of targetWord is "aaaa" -> "0000" -> 0. We return true because 0 + 0 == 0.

Constraints:

1 <= firstWord.length, secondWord.length, targetWord.length <= 8 firstWord, secondWord, and targetWord consist of lowercase English letters from 'a' to 'j' inclusive.

carloscn commented 1 year ago

Analysis

fn convert_i32(input: &str) -> i32
{
    if input.len() < 1 {
        return -1;
    }

    let mut ret:i32 = 0;
    let mut in_vec:Vec<i32> = input.chars()
                                   .map(|x| (x as u8 - 'a' as u8) as i32)
                                   .collect();

    for i in 0..in_vec.len() {
        ret += in_vec[in_vec.len() - i - 1] * i32::pow(10, i as u32);
    }

    return ret;
}

pub fn is_sum_equal(first_word: &str, second_word: &str, target_word: &str) -> bool
{
    if first_word.is_empty() ||
       second_word.is_empty() ||
       target_word.is_empty() {
        return false;
    }

    let f = convert_i32(first_word);
    if f < 0 {
        return false;
    }
    let s = convert_i32(second_word);
    if s < 0 {
        return false;
    }
    let t = convert_i32(target_word);
    if t < 0 || f + s != t {
        return false;
    }

    return true;
}
carloscn commented 1 year ago

Code

https://review.gerrithub.io/c/carloscn/structstudy/+/557555 https://github.com/carloscn/structstudy/commit/c37ca2225ebd77a4038514049d0c7998766d1d9a