薯队长写了一篇笔记草稿,请你帮忙输出最后内容。
1.输入字符包括,"(" , ")" 和 "<"和其他字符。
2.其他字符表示笔记内容。
3.()之间表示注释内容,任何字符都无效。 括号保证成对出现。
4."<"表示退格, 删去前面一个笔记内容字符。括号不受"<"影响 。
输入一行字符串。长度<=10000.
输出一行字符串,表示最终的笔记内容。
Corona(Trump)USA<<<Virus
CoronaVirus
import java.util.Scanner; /** * Created with IntelliJ IDEA. * * @Auther: jayclin * @Date: 2020/06/07/19:57 * @Description: * 链接:https://www.nowcoder.com/questionTerminal/0823ca800ee04706a7e2dafc837dc236 * 来源:牛客网 * * 薯队长写了一篇笔记草稿,请你帮忙输出最后内容。 * 1.输入字符包括,"(" , ")" 和 "<"和其他字符。 * 2.其他字符表示笔记内容。 * 3.()之间表示注释内容,任何字符都无效。 括号保证成对出现。 * 4."<"表示退格, 删去前面一个笔记内容字符。括号不受"<"影响 。 */ public class Solution { public static String output(String str){ StringBuilder stringBuilder=new StringBuilder(); int n=str.length(); int num=0;//记录括号的个数 for (int i=0;i<n;i++){ if (str.charAt(i)=='(')num++; if(num!=0){ if (str.charAt(i)==')') num--; continue; } if(str.charAt(i)=='<'){ stringBuilder.deleteCharAt(stringBuilder.length()-1); continue; } stringBuilder.append(str.charAt(i)); } return stringBuilder.toString(); } public static void main(String[] args) { Scanner s=new Scanner(System.in); String str=s.nextLine(); System.out.println(output(str)); } }
#include<iostream> #include<string> using namespace std; int main() { string str; getline(cin, str); string res; for (int i = 0; i < str.size(); i++) { if (str[i] == '(') { i++; int n = 1; while (i < str.size() && n != 0) { if (str[i] == '(') n++; if (str[i] == ')') n--; if (n == 0) break; i++; } } else if (str[i] == '<') { if (!res.empty()) res.pop_back(); } else { res.push_back(str[i]); } } cout << res << endl; return 0; }
function fun(str) { let arr = str.split(''); let res = []; let flag = false; arr.forEach(val => { if (val == '(') { flag = true; return true; } if (flag) { if (val == ')') { flag = false; } return true; } if (val == '<') { res.pop(); } else { res.push(val); } }); return res.join(''); } console.log(fun('Corona(Trump)USA<<<Virus')); // CoronaVirus第一个 JavaScript ^_^解答
#include <iostream> #include <vector> using namespace std; /* run this program using the console pauser&nbs***bsp;add your own getch, system("pause")&nbs***bsp;input loop */ int main(int argc, char** argv) { string s; cin>>s; int k=0; vector<char> m; for(int i=s.length()-1;i>=0;i--){ if(s[i]=='<'){ int l=1; while(l){ i--; if(s[i]=='<') l++; if(s[i]!='<'&&s[i]!=')') { l--; } if(s[i]==')'){ k+=l; l=0; i++; } } }else if(s[i]==')'){ int h=1; while(h){ i--; if(s[i]=='('){ h--; } if(s[i]==')'){ h++; } } }else{ if(k!=0){ i=i-k; k=0; i++; }else{ m.push_back(s[i]); } } } for(int i=m.size()-1;i>=0;i--){ cout<<m[i]; } return 0; }
import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); StringBuffer stringBuffer = new StringBuffer(); stringBuffer = new StringBuffer(scanner.nextLine()); List<Integer> k = new ArrayList<>(); //用一个列表来装括号的匹配 //遇见‘(’添加首次匹配位置进去 //遇见‘)’从最后一次‘(’匹配位置开始删除字符串 for(int i = 0; i < stringBuffer.length();){ if(stringBuffer.charAt(i)=='(') { k.add(i); i++; } else if(stringBuffer.charAt(i)=='<'&&k.size()==0) { stringBuffer.delete(i - 1, i + 1); i = i - 1; } else if(stringBuffer.charAt(i)==')') { stringBuffer.delete(k.get(k.size() - 1),i + 1); i = k.get(k.size() - 1); k.remove(k.size() - 1); } else i++; } System.out.println(stringBuffer); } }
function fun(str) { var stack = []; str = str.split(""); var res = ''; for (var i = 0; i < str.length; i++) { if(str[i] != "(" && str[i] != ")" && stack.length == 0){ res += str[i] } if(str[i] == "(" ){ stack.push(i) } if(str[i] == ")"){ stack.pop() } } res = res.split(""); for(var i = 0 ; i < res.length ; i++){ if(res[i] == "<"){ res.splice(i-1,2); i--; i--; } }; return res.toString().replace(/\,/g,"") }
import java.util.*; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String str = scanner.next(); while(str.contains(")") ) { int right = str.indexOf(")"); int left = str.lastIndexOf("(",right); String n = ""; String rep = str.substring(left+1,right); str = str.replace("(" +rep+")",n ); } while(str.contains("<")&& str != null) { int index = str.indexOf("<"); String m = ""; String rep2 = str.substring(index -1,index); str = str.replace(rep2 + "<",m ); } System.out.println(str); } }
import sys def translate(word): stack = [] while word: k = word.pop() if k == ")": while True: v = stack.pop() if v == "(": break elif k == "<": stack.pop() else: stack.append(k) res = "" while stack: res += stack.pop(0) return res string = sys.stdin.readline() liststring = list(string[::-1]) ans = translate(liststring) sys.stdout.write(ans)
需要注意括号中的字符要排除括号本身才能正确地按层次关系匹配。
举个例子,针对1(23(4)5)67
,如果使用\\(.*?\\)
来匹配首先匹配到的是(23(4)
。
类似地,为了防止<
消除<
自身,也需要排除<
。
package main import ( "fmt" "regexp" ) func main() { in:="" fmt.Scan(&in) reg,_:=regexp.Compile("\\([^\\(\\)]*?\\)") for reg.MatchString(in){ in=reg.ReplaceAllString(in,"") } reg,_=regexp.Compile("[^<]<") for reg.MatchString(in){ in=reg.ReplaceAllString(in,"") } fmt.Println(in) }
let line = readline(); const filterText = (line) => { let a = [] for (let item of line) { if(item === ')'){ while(a.pop()!=='('); }else if(item === '<'){ a.pop() } else { a.push(item) } } return a.join(''); } console.log(filterText(line));
//思路:从字符串后面开始遍历,遇到'<'表示后续遍历遇到字符就可以直接跳过 //在括号内的字符不添加,因此设置state来表示括号嵌套层数 #include<iostream> #include<algorithm> #include <string> using namespace std; int main(){ string s; getline(cin,s); int n=s.size(); int state=0;//state=0表示不在括号内,state>0表示在括号内(state=1表示一层嵌套,state=2表示两层嵌套) int needDel=0;//遇到'<',就记录后续需要删除的元素+1,后续遇到括号外的字符,就可以直接略过了 string res; for(int i=n-1;i>=0;i--){ char c=s[i]; if(state==0){//括号外 if(c=='<') needDel++; else if(c==')') state=1; else{ if(needDel>0) needDel--; else res+=c; } } else if(state>0){//括号内 if(c==')') state++;//嵌套层数+1 if(c=='(') state--;//嵌套层数-1 } } for(int i=res.size()-1;i>=0;i--){ cout<<res[i]; } system("pause"); return 0; }
function logNote(str){ // 用栈做存储 遇到(的时候不处理 遇到 )后继续push进去 遇到< 直接pop出去 let stack = []; let arr = str.split(''); //阀门 let valve = true; arr.forEach((item) => { if(item == '('){ valve = false; }else if(item == ')'){ valve = true; return; } if(valve){ stack.push(item); } if(item == '<'){ stack.pop(); } }); return stack.join(); }
#include <iostream> #include <string> using namespace std; int main(int argc, char* argv[]){ string str; char c; int bracket = 0; while((c = getchar()) != '\n'){ switch(c){ case '(': bracket++; break; case ')': bracket--; break; case '<': if(!bracket) str.pop_back(); break; default: if(!bracket) str += c; break; } } cout << str << endl; return 0; }
#include <stdio.h> #include <string.h> #include <stdlib.h> int main() { char str[10001]; fgets(str, 10001, stdin); int len = strlen(str); if (str[len - 1] == '\n') { str[len - 1] = '\0'; len--; } char* newstr = malloc(len * sizeof(char)); int k = 0; int j = 0; for (int i = 0; i < len; i++) { if (str[i] == '(') { k++; } else if (str[i] == ')') { k--; } else if (k == 0) { if (str[i] == '<') { newstr[j] = '\0'; j -= 1; } else { newstr[j] = str[i]; j++; } } } for (int i = 0; i < j; i++) { if (newstr[i] != '\0') { printf("%c", newstr[i]); } } return 0; }
import sys l=input() stack=[] while True: changed=False new_s="" i=0 n=len(l) has2=False while i<n: if l[i]=="(": stack.append("(") for j in range(i+1,n): i+=1 if l[j]=="(": stack.append("(") if l[j]==")": stack.pop() if not stack: i+=1 break changed=True elif i<n and l[i]=="<" : i+=1 new_s=new_s[:-1] has2=True changed=True else: new_s+=l[i] # print(l[i]) i+=1 if not changed: break l=new_s print(l)