薯队长写了一篇笔记草稿,请你帮忙输出最后内容。
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)