LeetCode-找不同

87 阅读2分钟

LeetCode-找不同

给定两个字符串 st ,它们只包含小写字母。

字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。

请找出在 t 中被添加的字母。

示例 1:

输入:s = "abcd", t = "abcde"
输出:"e"
解释:'e' 是那个被添加的字母。

示例 2:

输入:s = "", t = "y"
输出:"y"

提示:

  • 0 <= s.length <= 1000
  • t.length == s.length + 1
  • st 只包含小写字母

这个有个很大的坑,他的s的长度有可能会很长,相信有很多同学都会跟我一样,陷入其中

一起来康康这是个什么坑

/**
 * @param {string} s
 * @param {string} t
 * @return {character}
 */
var findTheDifference = function(s, t) {
    let res =''
    if(!s.length) return t
     t.split('').forEach(item=>{
        s.split('').forEach(i=>{
            if(i!==item) res = item
        })
    })
    if(!res.length) return t[t.length-1]
    return res
};

一开始,并没注意到他的这个提示,认为可能就短短的几个字符串,然后去切割长的那个,去遍历找短的字符串中,哪个是长字符串中独有的,就把这个返回

前几个测试用例还能通过,没想到,有个测试用例,一大长串的字符串,突然意识到,他可能24个英文字母,每个都有可能出现,那这种解法,就没办法完成了

于是,打算用映射表的方式,来处理这个

/**
 * @param {string} s
 * @param {string} t
 * @return {character}
 */
var findTheDifference = function(s, t) {
    let map = {}
    let map1 = {}
    s.split('').forEach(item=>{
        if(map[item] !== undefined){
            map[item] += 1
        }else{
            map[item] = 0
        }
    })
    t.split('').forEach(item=>{
         if(map1[item] !== undefined){
            map1[item] += 1
        }else{
            map1[item] = 0
        }
    })
    
    let res = ''
    for(let i in map1){
        if(map1?.[i] !== map?.[i]){
            res = i
        }
    }
    return res
};

两个字符串都转成数组,把每个字母出现的次数做一个统计,在统计完之后,对比两个映射表的不同,题目中提到随机位置添加一个字母,那么就只会有一个字母出现的数量不同,将两个表进行对比,不同的这个,就是随机添加的这个.

看了一下他们的题解,似乎都要进行两次循环,有没有什么方法,能够尽可能的减少循环, 评论区聊聊吧!