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

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 字符串的有效字符,如果是退格符,就出栈;否则入栈;最后比较两个栈是否相同;

		bool backspaceCompare(char* s, char* t)
		{
		    // 创建 s 字符串和 t 字符串的栈,存放有效的字符
		    char stackS[201] = "\0";
		    char stackT[201] = "\0";
		
		    //topS 和 topT 记录栈顶
		    int topS = 0, topT = 0;
		    for (int i = 0; i < strlen(s); i++)
		    {
		        //如果是退格符,并且不是第一个字符,就出栈,并补个'\0'
		        if (s[i] == '#')
		        {
		            if (topS)
		            {
		                topS--;
		                stackS[topS] = '\0';
		            }
		        }
		
		        //否则,就入栈
		        else
		        {
		            stackS[topS++] = s[i];
		        }
		
		    }
		
		    //同理,栈T也和栈S一样 
		    for (int i = 0; i < strlen(t); i++)
		    {
		        if (t[i] == '#')
		        {
		            if (topT)
		            {
		                topT--;
		                stackT[topT] = '\0';
		            }
		        }
		
		        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 字符串的长度加一;如果是第一个位置或者栈顶元素不等于当前字符串的字符,就入栈;否则就出栈,并补上’\0’;在最后也要补上’ \0 ';

		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];
		        }
		
		        //否则,就出栈,并补上'\0'
		        else
		        {
		            pos--;
		            Stack[pos] = '\0';
		        }
		    }
		
		    //在最后加上'\0'
		    Stack[pos] = '\0';
		    return Stack;
		}

猜你喜欢

转载自blog.csdn.net/YoungMLet/article/details/131356390