假设一个字符串中的括号都是成对的,请编写一个算法,将从左数第n对括号内的子串取出并返回。
例如(ad(d(d(adb)de)d)d),从左数第n=3对括号内取子串,返回d(adb)de

解决方案 »

  1.   

    String test = "(ad(d(d(adb)de)d)d)";
    int n = 3;
    for (int i = 0; i < n; i++) {
        int first = test.indexOf("(");
        int last = test.lastIndexOf(")");
        test = test.substring(first + 1, last);
    }
    System.out.println(test);
    都是基础的字符串的方法
      

  2.   

    假如n=2:
    从左边数第二个左括号,记录其下标a,逆序遍历字符串同样寻找第二个右括号,记录其下标b。最后用substring截取截取a+1到b的字符串不就行了。
    不过有时要考虑输入的字符串是否符合要求。
      

  3.   

    我的方法 可以处理(a(j)(((d((gh)f))c)b)(i))
      

  4.   

    这段代码看看可符合要求。
    import java.util.Scanner;
    import java.util.Stack;public class GetBracket
    {    //左、右括号常量
        private static final char LEFTBRACKET = '(';
        private static final char RIGHTBRACKET = ')';    //第N对括号
        private static final int TARGETNUM = 3;    public static void main(String[] args)
        {
            //键盘输入字符串
            System.out.print("请输入待测试的字符串:");
            Scanner sc = new Scanner(System.in);
            String testStr = sc.nextLine();        //不为空,则进行处理,截取字符串
            if (null == testStr || testStr.length() <= 0)
            {
                System.out.println("输入的字符串为空。");
                return;
            }        //转换为数组处理
            char[] cArr = testStr.toCharArray();
            //校验括号匹配性以及是否达到目标数
            if (!isAllowed(cArr))
            {
                return;
            }
            
            //截取括号中的字符串
            String targetStr = getStrFromBracket(cArr);
            if (null != targetStr)
            {
                System.out.println("截取目标括号中的字符串内容为:" + targetStr);
            }
        }    /**
         * 入参的字符串括号要匹配,个数要超过TARGETNUM值
         */
        private static boolean isAllowed(char[] arr)
        {
            //若长度小于TARGETNUM,则括号数不够
            if (null == arr || arr.length < TARGETNUM)
            {
                System.out.println("入参字符串不合法!");
                return false;
            }        //左括号计数器
            int counter = 0;
            Stack<Character> stack = new Stack<Character>();
            for (int i = 0; i < arr.length; i++)
            {
                char k = arr[i];
                switch (k)
                {
                    //左括号,计数器+1
                    case LEFTBRACKET:
                    {
                        counter++;
                        stack.add(k);
                        break;
                    }
                        //右括号,找出相应的左括号出栈
                    case RIGHTBRACKET:
                    {
                        if (stack.isEmpty())
                        {
                            System.out.println("入参字符串不合法!");
                            return false;
                        }
                        stack.pop();
                        break;
                    }
                    default:
                }
            }        //若匹配括号数少于目标值或者括号不匹配
            if (counter < TARGETNUM || !stack.isEmpty())
            {
                System.out.println("入参字符串不合法!");
                return false;
            }
            return true;
        }    /**
         * 从合法的字符串数组中,找到指定的字符串
         * @param cArr
         * @return 
         * @see
         */
        private static String getStrFromBracket(char[] cArr)
        {
            //左右下标初始化
            //int left = 0;
            //int right = 0;        //成对括号计数器
            int counter = 0;        int i = 0;
            //找到第N个左括号
            for (; i < cArr.length && counter < TARGETNUM; i++)
            {
                if (LEFTBRACKET == cArr[i])
                {
                    counter++;
                }
            }        //从目标左括号开始截取字符串
            int leftNum = 0;
            StringBuilder sb = new StringBuilder();
            outer: for (; i < cArr.length; i++)
            {
                if (cArr[i] == RIGHTBRACKET)
                {
                    //左右括号数匹配了
                    --leftNum;
                    if (leftNum < 0)
                    {
                        break outer;
                    }
                }
                else if (cArr[i] == LEFTBRACKET)
                {
                    //多余的左括号也要加入到String中,这里不需要break操作
                    ++leftNum;
                }
                sb.append(cArr[i]);
            }
            return sb.toString();
        }
    }