列表

详情


1638. 统计只差一个字符的子串数目

给你两个字符串 s 和 t ,请你找出 s 中的非空子串的数目,这些子串满足替换 一个不同字符 以后,是 t 串的子串。换言之,请你找到 s 和 t 串中 恰好 只有一个字符不同的子字符串对的数目。

比方说, "computer" 和 "computation" 加粗部分只有一个字符不同: 'e'/'a' ,所以这一对子字符串会给答案加 1 。

请你返回满足上述条件的不同子字符串对数目。

一个 子字符串 是一个字符串中连续的字符。

 

示例 1:

输入:s = "aba", t = "baba"
输出:6
解释:以下为只相差 1 个字符的 s 和 t 串的子字符串对:
("aba", "baba")
("aba", "baba")
("aba", "baba")
("aba", "baba")
("aba", "baba")
("aba", "baba")
加粗部分分别表示 s 和 t 串选出来的子字符串。
示例 2:
输入:s = "ab", t = "bb"
输出:3
解释:以下为只相差 1 个字符的 s 和 t 串的子字符串对:
("ab", "bb")
("ab", "bb")
("ab", "bb")
加粗部分分别表示 s 和 t 串选出来的子字符串。
示例 3:
输入:s = "a", t = "a"
输出:0

示例 4:

输入:s = "abe", t = "bbc"
输出:10

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int countSubstrings(string s, string t) { } };

python3 解法, 执行用时: 60 ms, 内存消耗: 14.9 MB, 提交时间: 2022-11-17 18:00:51

class Solution:
    def countSubstrings(self, s: str, t: str) -> int:
        m, n = len(s), len(t)
        
        # 方法二:只存储斜上方的值
        # 记录 (以s[i]和t[j]结尾的 满足条件的子字符串对数目, 连续相同的位数)
        tot = 0
        # 左下角
        for i in range(m-1, -1, -1):
            last = (0, 0)  # 初始
            for j in range(min(m-i, n)):
                if s[i+j] == t[j]:
                    cur = (last[0], last[1] + 1)
                    tot += last[0]
                else:
                    cur = (last[1] + 1, 0)
                    tot += last[1] + 1
                last = cur
        # 补全右上角
        for j in range(1, n):
            last = (0, 0)
            for i in range(min(n-j, m)):
                if s[i] == t[j+i]:
                    cur = (last[0], last[1] + 1)
                    tot += last[0]
                else:
                    cur = (last[1] + 1, 0)
                    tot += last[1] + 1
                last = cur
        return tot

python3 解法, 执行用时: 68 ms, 内存消耗: 14.9 MB, 提交时间: 2022-11-17 18:00:31

class Solution:
    def countSubstrings(self, s: str, t: str) -> int:
        m, n = len(s), len(t)

        # 方法一:用dp存储一行
        dp = [(0, 0)]*(n+1) # 记录 (以s[i]和t[j]结尾的 满足条件的子字符串对数目, 连续相同的位数)
        tot = 0   # 总的满足条件的子字符串对数目
        for i in range(m):
            last = dp[0]
            for j in range(n):
                if s[i] == t[j]:
                    cur = (dp[j][0], dp[j][1] + 1)
                    tot += dp[j][0]
                else:
                    cur = (dp[j][1] + 1, 0)
                    tot += dp[j][1] + 1
                dp[j], last = last, cur
            dp[n] = last
        return tot

上一题