题意整理
- 给定输入字符串,按规则打印出来。
- 如果不是'<',正常打印,如果是'<'并且前面字符不为空,则删除上一次打印的字符。
方法一(栈)
1.解题思路
用栈记录每次打印的字符,如果当前字符是'<',并且栈不为空,则弹出栈顶元素。最后将栈中所有元素返回。
动图展示:
2.代码实现
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @return string字符串
*/
public String Typing (String s) {
//初始化栈和可变字符串
LinkedList<Character> stack=new LinkedList<>();
StringBuilder sb=new StringBuilder();
for(char c:s.toCharArray()){
//如果不是'<'就添加
if(c!='<'){
stack.push(c);
}
//如果是'<'并且不为空,就回退
else{
if(!stack.isEmpty()){
stack.pop();
}
}
}
//将栈中字符添加到可变字符串sb
while(!stack.isEmpty()){
sb.append(stack.pop());
}
return sb.reverse().toString();
}
}3.复杂度分析
- 时间复杂度:需要遍历一次输入字符串,以及取出栈中所有元素,所以时间复杂度是
。
- 空间复杂度:需要额外大小为n的栈,所以空间复杂度是
。
方法二(模拟)
1.解题思路
初始化一个可变字符串,如果当前不是'<'就添加,如果是,并且之前字符串不为空就回退。
2.代码实现
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @return string字符串
*/
public String Typing (String s) {
//新建可变字符串
StringBuilder sb=new StringBuilder();
for(char c:s.toCharArray()){
//如果不是'<'就添加
if(c!='<'){
sb.append(c);
}
//如果是'<'并且不为空,就回退
else{
if(sb.length()>0){
sb.deleteCharAt(sb.length()-1);
}
}
}
return sb.toString();
}
} 3.复杂度分析
- 时间复杂度:需要遍历一次输入字符串,所以时间复杂度是
。
- 空间复杂度:不需要额外的空间,所以空间复杂度是
。

京公网安备 11010502036488号