C++ 实现字符串子序列匹配计数

给定字符串 s 和字符串数组 words,返回 words[i] 中是 s 的子序列的单词个数。

字符串的子序列是从原始字符串中生成的新字符串,可以从中删去一些字符(可以是 none),而不改变其余字符的相对顺序。 例如,'ace' 是 'abcde' 的子序列。

以下代码实现了一个函数来计算匹配的子序列数量,但存在一些逻辑错误:

class Solution {
public:
    int numMatchingSubseq(string s, vector<string>& words) {
        int num = 0;
        //s = "abcde", words = ["a","bb","acd","ace"]
        for (int i = 0; i < words.size(); i++) {
            string s1 = s;
            int n = 0;
            for (int j = 0; j < words[i].size(); j++) {
                auto it = s1.find(words[i][j]);
                if (it == string::npos)
                    continue;
                n++;
                swap(s1[s1.size() - 1], s1[it]);
                s1 = s1.erase(s1.size() - n);
                if (j == words[i].size() - 1)
                    num++;
            }

        }
        return num;  
    }
};

错误分析:

  1. 在每次找到一个匹配字符时,你使用了 swaperase 操作来将该字符从字符串中删除,但这样会改变其他字符的相对顺序。你需要找到匹配字符后,只删除该字符即可,而不需要改变其他字符的位置。
  2. 你没有考虑到如果字符串 words[i] 的字符在字符串 s 中有多个匹配的情况,你只计算了匹配的字符个数,没有确保这些字符的位置是连续的。

解决方案:

为了解决上述错误,你需要修改代码逻辑,确保找到的匹配字符是连续的,并且在删除匹配字符时,只删除该字符,而不改变其他字符的位置。

以下是一个修改后的代码实现:

class Solution {
public:
    int numMatchingSubseq(string s, vector<string>& words) {
        int num = 0;
        for (int i = 0; i < words.size(); i++) {
            int j = 0; // words[i] 中的索引
            int k = 0; // s 中的索引
            while (k < s.size() && j < words[i].size()) {
                if (s[k] == words[i][j]) {
                    j++;
                }
                k++;
            }
            if (j == words[i].size()) { // words[i] 是 s 的子序列
                num++;
            }
        }
        return num;
    }
};

代码解释:

  • 使用两个索引 jk 分别遍历 words[i]s
  • 循环遍历 s,如果当前字符 s[k]words[i] 的当前字符 words[i][j] 相匹配,则将 jk 都加 1,继续比较下一个字符。
  • 如果循环结束时,j 等于 words[i].size(),说明 words[i]s 的子序列。

总结:

通过修改代码逻辑,我们成功地解决了原代码中的错误,并实现了字符串子序列匹配计数的功能。

C++ 实现字符串子序列匹配计数

原文地址: https://www.cveoy.top/t/topic/pbL1 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录