题意整理
- 给定输入字符串,按规则打印出来。
- 如果不是'<',正常打印,如果是'<'并且前面字符不为空,则删除上一次打印的字符。
方法一(栈)
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.复杂度分析
- 时间复杂度:需要遍历一次输入字符串,所以时间复杂度是 。
- 空间复杂度:不需要额外的空间,所以空间复杂度是 。