583. 两个字符串的删除操作

583. 两个字符串的删除操作

题目描述

给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。

示例 1:
输入: “sea”, “eat”
输出: 2
解释: 第一步将"sea"变为"ea",第二步将"eat"变为"ea"

说明:
给定单词的长度不超过500。
给定单词中的字符只含有小写字母。

解题思路

  • 先求出最长公共子序列(LCS),这就是两个字符串相同时候的长度
  • 将两个字符串的长度和减去两倍的LCS,就是需要的操作步数
class Solution {
public:
    int minDistance(string word1, string word2) {
        //最长公共子序列问题
        int len1=word1.size(),len2=word2.size();
        int dp[501][501];
        for(int i=0;i<len1;i++){
            for(int j=0;j<len2;j++){
                if(word1[i]==word2[j]){
                    dp[i+1][j+1]=dp[i][j]+1;
                }else{
                    dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j]);
                }
            }
        }
        return len1+len2-dp[len1][len2]*2;
    }
};
<think>首先,用户的问题是:在C++中实现计算两个字符串删除操作,并找出被删除的字符。具体来说,是比较两个字符串,找出哪些字符被删除了。用户提到:"C++两个字符串比较删除操作找出被删除的字符实现方法"。所以,我需要提供一个C++实现来比较两个字符串,并识别出被删除的字符。从系统级指令中,我有一些约束:-所有行内数学表达式必须使用$...$格式。-独立公式使用$$...$$。-使用中文回答。-生成相关问题。-回答结构清晰,逐步解决问题。-引用末尾添加引用标识。用户还提供了一个引用:[^1],是关于找出两个字符串唯一不同的字符算法。但用户说这不是真正的需求,我应该参考用户上一次的问题。在对话历史中,用户提到了这个引用,但我需要基于当前问题。当前问题:实现一个方法,比较两个字符串,找出被删除的字符。这类似于找差异,比如从一个字符串到另一个字符串,哪些字符被删除了。例如:-字符串A:"abcde"-字符串B:"ace"-被删除的字符是'b'和'd'。所以,我需要一个算法来比较两个字符串,并输出被删除的字符。一个常见的方法是使用最长公共子序列(LCS)或直接比较位置。简单方法:1.遍历两个字符串,找出不同的位置。2.但用户提到"删除操作",所以可能是从一个字符串删除一些字符得到另一个字符串。假设字符串A是原始字符串字符串B是修改后的字符串。我们需要找出在A中但不在B中的字符(即被删除的字符)。算法步骤:-使用两个指针,一个指向A,一个指向B。-比较当前字符:-如果相同,则两个指针都移动。-如果不同,则A的字符是被删除的,记录它,并只移动A的指针。-如果A指针移动完了,但B还有剩余,则那些是添加的字符,但用户只关心删除,所以可能忽略添加。-用户说"被删除的字符",所以只关心从A中删除的字符。例如:A:"abcde"B:"ace"-比较A[0]='a'和B[0]='a':相同,移动。-A[1]='b'和B[1]='c':不同,所以'b'被删除,记录,移动A指针到'c'。-现在A[2]='c'和B[1]='c':相同,移动。-A[3]='d'和B[2]='e':不同,所以'd'被删除,记录,移动A指针。-A结束。输出被删除字符:'b','d'如果B有添加的字符,比如A:"ace",B:"abcde",那么被删除的字符是空,但添加了'b'和'd'。但用户的问题指定了"删除操作",所以可能假设我们是从A到B的删除。在实现中,我需要明确输入:两个字符串str1和str2,假设str1是原始,str2是修改后。为了通用性,我可以实现一个函数,输出从str1到str2的差异:删除的字符和添加的字符。但用户只要求"找出被删除的字符",所以我应该只关注删除部分。现在,C++实现:-函数签名:vector<char>findDeletedCharacters(conststring&str1,conststring&str2);-或者输出位置或字符本身。用户说"找出被删除的字符",所以输出字符列表。算法:1.初始化两个索引i=0forstr1,j=0forstr2.2.创建一个vector来存储删除的字符。3.whilei<str1.length()andj<str2.length():-ifstr1[i]==str2[j]:-i++,j++-else:-假设str1[i]被删除,push_back(str1[i]),i++4.如果i<str1.length(),剩余字符都是被删除的。5.如果j<str2.length(),剩余是添加的,但我们不关心。步骤4:在比较后,如果str1还有剩余,那些字符都是被删除的,因为没有匹配。在例子中,工作正常。边界情况:-如果str1==str2,没有删除。-如果str2是空字符串,所有str1字符被删除。-如果str1是空字符串,没有删除,但可能有添加。现在,C++代码:我需要提供代码片段。根据指令,代码块应该像示例中那样,使用```language```格式。另外,生成相关问题。回答结构:1.解释问题和方法。2.提供C++实现代码。3.解释代码。4.生成相关问题。使用中文。引用:用户提供了引用[^1],但我应该基于问题。引用是关于找唯一不同字符,但这里可能有多个删除。我可以参考它,但需要调整。在回答中,自然地添加引用标识。最后,生成相关问题。完整回答:-引言:解释如何比较两个字符串找出被删除的字符。-算法描述。-C++代码实现。-代码解释。-生成相关问题。</think>### 在C++中实现两个字符串比较并找出被删除的字符 在C++中,比较两个字符串并找出被删除的字符,通常涉及分析字符串差异:假设第一个字符串是原始字符串,第二个是修改后的字符串,我们需要识别出在原始字符串中出现但在修改后字符串中缺失的字符。这可以通过**双指针遍历算法**实现,核心思想是逐个比较字符位置,记录不匹配的字符作为删除操作的结果。算法时间复杂度为$O(n)$,其中$n$为字符串长度,空间复杂度为$O(k)$($k$为删除字符数),高效可靠[^1]。 #### 算法步骤 1. **初始化指针**:使用两个指针`i`和`j`,分别指向原始字符串`str1`和修改后字符串`str2`的起始位置。 2. **遍历比较**: - 如果`str1[i] == str2[j]`,说明字符匹配,两个指针同时后移。 - 如果`str1[i] != str2[j]`,说明`str1[i]`被删除,记录该字符,并只移动`str1`的指针。 3. **处理剩余字符**:遍历结束后,如果`str1`还有剩余字符,这些字符均被视为删除。 4. **输出结果**:返回所有被删除字符的集合(可能包含重复字符,如果原始字符串有重复)。 #### C++代码实现 以下是完整的C++实现,包括函数定义和示例用法: ```cpp #include <iostream> #include <vector> #include <string> // 函数:找出从str1到str2中被删除的字符 std::vector<char> findDeletedCharacters(const std::string& str1, const std::string& str2) { std::vector<char> deletedChars; // 存储被删除字符 int i = 0, j = 0; // 双指针,i用于str1,j用于str2 // 遍历两个字符串 while (i < str1.length() && j < str2.length()) { if (str1[i] == str2[j]) { // 字符匹配,指针同时后移 i++; j++; } else { // 字符不匹配,记录str1[i]为被删除字符 deletedChars.push_back(str1[i]); i++; // 只移动str1指针 } } // 处理str1剩余字符(均被删除) while (i < str1.length()) { deletedChars.push_back(str1[i]); i++; } return deletedChars; } int main() { // 示例用法 std::string original = "abcde"; std::string modified = "ace"; std::vector<char> deleted = findDeletedCharacters(original, modified); // 输出结果 std::cout << "原始字符串: " << original << std::endl; std::cout << "修改后字符串: " << modified << std::endl; std::cout << "被删除字符: "; for (char c : deleted) { std::cout << c << " "; } std::cout << std::endl; return 0; } ``` #### 代码解释 - **函数`findDeletedCharacters`**: - 输入:`str1`(原始字符串),`str2`(修改后字符串)。 - 输出:`std::vector<char>`,包含所有被删除字符。 - 逻辑:使用双指针遍历,当字符不匹配时,`str1`的当前字符被视为删除;遍历结束后,`str1`的剩余字符自动记录为删除。 - **示例输出**: - 对于输入`str1 = "abcde"`, `str2 = "ace"`,输出被删除字符为`b d`。 - **边界处理**: - 如果`str1`为空字符串,返回空向量(无删除)。 - 如果`str2`为空字符串,`str1`所有字符均被删除。 - 如果字符串有重复字符(如`str1 = "aabb"`, `str2 = "ab"`),算法正确输出重复删除字符(`a b`)。 此方法基于字符串比较的逐位分析,确保高效性和正确性,特别适合文本编辑或差异检测场景[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值