比较含退格的字符串
给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。 # 代表退格字符。
注意:如果对空文本输入退格字符,文本继续为空。
示例 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 = "#a#c"
输出:true
解释:S 和 T 都会变成 “c”。
示例 4:
输入:S = "a#c", T = "b"
输出:false
解释:S 会变成 “c”,但 T 仍然是 “b”。
提示:
- 1 < = S . l e n g t h < = 200 1 <= S.length <= 200 1<=S.length<=200
- 1 < = T . l e n g t h < = 200 1 <= T.length <= 200 1<=T.length<=200
- S 和 T 只含有小写字母以及字符
'#'。
进阶:你可以用 O(N) 的时间复杂度和 O(1) 的空间复杂度解决该问题吗?
题目要求很简单,对于输入字符串T或者S来说,如果遇到退格字符#,就需要将它前面的一个字符退格(删除)。最后判断剩下的字符串T和字符串S是否一致,如果一致返回true,否则返回false。
由于涉及到可能的删除操作,我们可以使用Stack来存储字符串中可能出现的所有字符,最后判断Stack表示的字符串是否一致即可。
class Solution {
public boolean backspaceCompare(String S, String T) {
String r1 = judge(S);
String r2 = judge(T);
return r1.equals(r2) ? true : false;
}
public String judge(String str){
if(str == null){
return new String();
}
Stack<Character> stack = new Stack<>();
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if(c != '#'){
stack.push(c);
} else if(c == '#' && !stack.isEmpty()){
stack.pop();
} else {
continue;
}
}
return stack.toString();
}
}
长键输入
你的朋友正在使用键盘输入他的名字name。偶尔,在键入字符c 时,按键可能会被长按,而字符可能被输入1次或多次。你将会检查键盘输入的字符typed。如果它对应的可能是你的朋友的名字(其中一些字符可能被长按),那么就返回True。
示例 1:
输入:name = "alex", typed = "aaleex"
输出:true
解释:'alex' 中的 'a' 和 'e' 被长按。
示例 2:
输入:name = "saeed", typed = "ssaaedd"
输出:false
解释:'e' 一定需要被键入两次,但在 typed 的输出中不是这样。
示例 3:
输入:name = "leelee", typed = "lleeelee"
输出:true
示例 4:
输入:name = "laiden", typed = "laiden"
输出:true
解释:长按名字中的字符并不是必要的。
提示:
- n a m e . l e n g t h < = 1000 name.length <= 1000 name.length<=1000
- t y p e d . l e n g t h < = 1000 typed.length <= 1000 typed.length<=1000
- name 和 typed 的字符都是小写字母。
对于给定的字符串typed中的字符有两种合法的形式:
- 一种是和
name相对位置的字符相同 - 另一种属于长键字符,即当前位置的字符和它前一个位置的字符相同
题目要求在考虑长键输入的前提下,name和typed表示的字符串是否相同。因此,我们可以使用双指针法来遍历两个字符串。设定left和right分别指向name和typed的起始位置:
- 如果此时
left还未到达name的末尾,而且right指向的字符和left指向的字符相同,则两者都往后移动一次 - 如果
right不位于起始位置,而且right和right - 1指向的字符相同,这就输入长键字符,right往后移动 - 如果不满足上面的两种情况,那么
typed必然不能构成name,直接返回false
最后只需要判断left是否成功的到达字符串末尾。
class Solution {
public boolean isLongPressedName(String name, String typed) {
if(name == null || typed == null){
return false;
}
int left = 0;
int right = 0;
while(right < typed.length()){
if(left < name.length() && name.charAt(left) == typed.charAt(right)){
left++;
right++;
} else if(right > 0 && typed.charAt(right) == typed.charAt(right - 1)){
right++;
} else{
return false;
}
}
return left == name.length() ? true : false;
}
}
本文介绍如何通过栈和双指针法实现含退格符的字符串比较及长键输入的有效性验证。针对含退格符的字符串,采用栈进行字符的存储与删除操作,最终比较两个字符串是否相等;对于长键输入,使用双指针法遍历原始名称与输入字符串,判断后者是否能由前者合理生成。
1828

被折叠的 条评论
为什么被折叠?



