1.去掉所有括号内的内容
public static void main(String[] args) {
String dsr = "中国(合肥(安庆)蜀山)高校(jiaoyu)基地";
char[] dsrchar = dsr.toCharArray();
LinkedList dsrlist = new LinkedList<String>();
for (int i = 0; i < dsrchar.length;) {
if (dsrchar[i] == ')') {
i++;
while ((char) dsrlist.getLast() != '(') {
dsrlist.removeLast();
}
dsrlist.removeLast();
}else {
dsrlist.add(dsrchar[i]);
i++;
}
}
String dsrString = "";
List<String> arrayList = new ArrayList<String>(dsrlist);
String ssString = arrayList.toString();
ssString = ssString.replaceAll(",", "");
ssString = ssString.replaceAll("\\[", "");
ssString = ssString.replaceAll("\\]", "");
ssString = ssString.replace(" ", "");
System.out.println(ssString);
}
输出结果:
中国高校基地
2.多个括号嵌套,每个括号外有个数字表示重复的个数。(每个括号前面都会有数字)
例如: 输入 abc3(A) 输出abcAAA
输入 2(2(a)2(b)) 输出aabbaabb
自己目前写的比较冗余,以后想到复杂度低的再改进,但是可以暂时一步步理解。
public class Test {
public static void main(String[] args) {
long time1 = System.currentTimeMillis();
String dsr = "2{2[12(3(ab)3(ab))]}";
char[] dsrchar = dsr.toCharArray();
LinkedList<Character> dsrlist = new LinkedList();
for (int i = 0; i < dsrchar.length;) {
//遇到小括号
if (dsrchar[i] == ')') {
i++;
Stack stChar = new Stack();
while ( dsrlist.getLast() != '(') {
stChar.push(dsrlist.getLast());
dsrlist.removeLast();
}
dsrlist.removeLast();//删掉左括号
String temp = "";
while(!stChar.isEmpty()) {
temp+=stChar.pop();
}
//得到前面的数字
Stack<Character> stNum = new Stack();
while(!dsrlist.isEmpty()&&Character.isDigit(dsrlist.getLast())) {
stNum.push(dsrlist.getLast());
dsrlist.removeLast();
}
int count = Transform(stNum);
//将字符栈中的字符都出栈并加入到LinkedList里
char [] c = temp.toCharArray();
for(int j =1;j<=count;j++) {
for(int k = 0;k<c.length;k++) {
dsrlist.add(c[k]);
}
}
//遇到中括号
}else if (dsrchar[i] == ']') {
i++;
Stack stChar = new Stack();
while ( dsrlist.getLast() != '[') {
stChar.push(dsrlist.getLast());
dsrlist.removeLast();
}
dsrlist.removeLast();//删掉左括号
String temp = "";
while(!stChar.isEmpty()) {
temp+=stChar.pop();
}
//得到前面的数字
Stack<Character> stNum = new Stack();
while(!dsrlist.isEmpty()&&Character.isDigit(dsrlist.getLast())) {
stNum.push(dsrlist.getLast());
dsrlist.removeLast();
}
int count = Transform(stNum);
//将字符栈中的字符都出栈并加入到LinkedList里
char [] c = temp.toCharArray();
for(int j =1;j<=count;j++) {
for(int k = 0;k<c.length;k++) {
dsrlist.add(c[k]);
}
}
//遇到大括号
}else if (dsrchar[i] == '}') {
i++;
Stack stChar = new Stack();
while ( dsrlist.getLast() != '{') {
stChar.push(dsrlist.getLast());
dsrlist.removeLast();
}
dsrlist.removeLast();//删掉左括号
String temp = "";
while(!stChar.isEmpty()) {
temp+=stChar.pop();
}
//得到前面的数字
Stack<Character> stNum = new Stack();
while(!dsrlist.isEmpty()&&Character.isDigit(dsrlist.getLast())) {
stNum.push(dsrlist.getLast());
dsrlist.removeLast();
}
int count = Transform(stNum);
//将字符栈中的字符都出栈并加入到LinkedList里
char [] c = temp.toCharArray();
for(int j =1;j<=count;j++) {
for(int k = 0;k<c.length;k++) {
dsrlist.add(c[k]);
}
} }else {
dsrlist.add(dsrchar[i]);
i++;
}
}
System.out.println(dsrlist.toString());
System.out.println(dsrlist.toString());
StringBuilder sb = new StringBuilder();
for(Character c:dsrlist) {
sb.append(c);
}
System.out.println(sb.toString());
}
public static int Transform(Stack<Character> stNum) {
String s = "";
while(!stNum.isEmpty()) {
s+=stNum.pop();
}
return Integer.valueOf(s);
}
}
给定一个只包含字符’(’,’)’,’{’,’}’,’[‘和’]'的字符串,确定输入字符串是否有效。
如果输入字符串有效:
必须使用相同类型的括号关闭左括号。
必须以正确的顺序关闭打开括号。
Example 1:
Input: "()"
Output: true
Example 2:
Input: "()[]{}"
Output: true
Example 3:
Input: "(]"
Output: false
Example 4:
Input: "([)]"
Output: false
Example 5:
Input: "{[]}"
Output: true
public boolean isValid(String s) {
Stack<Character> st = new Stack();
for(int i = 0;i<s.length();i++) {
if(s.charAt(i) == '(' || s.charAt(i) == '{' || s.charAt(i) == '[') {
st.push(s.charAt(i));
}else {
if(st.empty()) return false;
char c = st.pop();
if(s.charAt(i) == ')') {
if(c!='(') return false;
continue;
}
if(s.charAt(i) == ']') {
if(c!='[') return false;
continue;
}
if(s.charAt(i) == '}') {
if(c!='{') return false;
continue;
}
}
}
if(st.empty()) return true;
return false;
}
4.给定n对括号,编写一个函数来生成格式正确的括号的所有组合。
For example, given n = 3, a solution set is:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
public List<String> generateParenthesis(int n){
List<String> list = new ArrayList();
if(n<=0) return list;
parentheses("",list,n,n);
return list;
}
public void parentheses(String str,List<String> list,int left,int right) {
if(left>right) return ;
if(left>0) parentheses(str+"(",list,left-1,right);
if(right>0) parentheses(str+")",list,left,right-1);
if(left == 0 && right == 0) {
list.add(str);
return ;
}
}