【Leetcode -844.比较含退格的字符串 -1047.删除字符串中的所有相邻重复项】

2024-03-01 10:17:40 浏览数 (2)

Leetcode -844.比较含退格的字符串

题目:给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。 注意:如果对空文本输入退格字符,文本继续为空。

示例 1: 输入:s = “ab#c”, t = “ad#c” 输出:true 解释:s 和 t 都会变成 “ac”。

示例 2: 输入:s = “ab##”, t = “c#d#” 输出:true 解释:s 和 t 都会变成 “”。

示例 3: 输入:s = “a#c”, t = “b” 输出:false 解释:s 会变成 “c”,但 t 仍然是 “b”。

提示: 1 <= s.length, t.length <= 200 s 和 t 只含有小写字母以及字符 ‘#’

思路:创建两个栈分别存放 s 字符串和 t 字符串的有效字符,如果是退格符,就出栈;否则入栈;最后比较两个栈是否相同;

代码语言:javascript复制
		bool backspaceCompare(char* s, char* t)
		{
		    // 创建 s 字符串和 t 字符串的栈,存放有效的字符
		    char stackS[201] = "";
		    char stackT[201] = "";
		
		    //topS 和 topT 记录栈顶
		    int topS = 0, topT = 0;
		    for (int i = 0; i < strlen(s); i  )
		    {
		        //如果是退格符,并且不是第一个字符,就出栈,并补个''
		        if (s[i] == '#')
		        {
		            if (topS)
		            {
		                topS--;
		                stackS[topS] = '';
		            }
		        }
		
		        //否则,就入栈
		        else
		        {
		            stackS[topS  ] = s[i];
		        }
		
		    }
		
		    //同理,栈T也和栈S一样 
		    for (int i = 0; i < strlen(t); i  )
		    {
		        if (t[i] == '#')
		        {
		            if (topT)
		            {
		                topT--;
		                stackT[topT] = '';
		            }
		        }
		
		        else
		        {
		            stackT[topT  ] = t[i];
		        }
		
		    }
		
		    //最后比较栈S和栈T是否相同
		    return (bool)!strcmp(stackS, stackT);
		}

Leetcode -1047.删除字符串中的所有相邻重复项

题目:给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。

在 S 上反复执行重复项删除操作,直到无法继续删除。 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

示例: 输入:“abbaca” 输出:“ca” 解释: 例如,在 “abbaca” 中,我们可以删除 “bb” 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 “aaca”,其中又只有 “aa” 可以执行重复项删除操作,所以最后的字符串为 “ca”。

提示: 1 <= S.length <= 20000 S 仅由小写英文字母组成。

思路:开辟一个栈,大小为 s 字符串的长度加一;如果是第一个位置或者栈顶元素不等于当前字符串的字符,就入栈;否则就出栈,并补上’’;在最后也要补上’ ';

代码语言:javascript复制
		char* removeDuplicates(char* s)
		{
		    //开辟 s 字符串长度加一的空间大小
		    char* Stack = (char*)malloc(sizeof(char) * (strlen(s)   1));
		
		    //pos为当前栈的位置
		    int pos = 0;
		
		    //遍历字符串
		    for (int i = 0; i < strlen(s); i  )
		    {
		        //如果是第一个位置或者栈顶元素不等于当前字符,就入栈
		        if (pos == 0 || Stack[pos - 1] != s[i])
		        {
		            Stack[pos  ] = s[i];
		        }
		
		        //否则,就出栈,并补上''
		        else
		        {
		            pos--;
		            Stack[pos] = '';
		        }
		    }
		
		    //在最后加上''
		    Stack[pos] = '';
		    return Stack;
		}

0 人点赞