算法一回首之《括號匹配算法》


 

括號匹配驗證:

一個字符串中,包括字符 ‘(‘, ‘)’, ‘{‘, ‘}’, ‘[‘, ‘]’。 要求寫一個函數,驗證字符串中這些括號是以正確的順序匹配的。 注意:(, ), [, ], {, }可以互相嵌套 譬如:"()"、"()[]{}"和"([]{[]})"是正確的,"(]" and "([)]"是不正確的

Tips:括號是可以嵌套的哦

實現:

    private static final Map<Character, Character> patternMatch = new ConcurrentHashMap<>();
​
    static {
        patternMatch.put('(', ')');
        patternMatch.put('{', '}');
        patternMatch.put('[', ']');
    }
​
    /**
     * 1.  括號匹配驗證
     * 一個字符串中,包括字符  ‘(‘,  ‘)’,  ‘{‘,  ‘}’,  ‘[‘,  ‘]’。
     * 要求寫一個函數,驗證字符串中這些括號是以正確的順序匹配的。
     * 注意:(,  ),  [,  ],  {,  }可以互相嵌套。
     * 譬如:"()"  和"()[]{}"是正確的,"(]"  and  "([)]"是不正確的
     *
     * @return
     */
    public boolean bracketMatch(String bracketSource) {
        if (StringUtils.isBlank(bracketSource)) {
            return false;
        }
        char[] charArray = bracketSource.toCharArray();
        Stack<Character> stack = new Stack<>();
        stack.push(charArray[0]);
        for (int i = 1; i < charArray.length; i++) {
            char next = charArray[i];
            if (stack.isEmpty()) {
                stack.push(next);
                continue;
            }
            Character first = stack.peek();
            if (Objects.equals(next, patternMatch.get(first))) {
                stack.pop();
            } else {
                stack.push(next);
            }
        }
        return stack.isEmpty();
    }

 

福利1:

二分查找【直接使用JDK中的了,經典無法超越】:

JDK1.8 java.util.Collections#indexedBinarySearch(java.util.List<? extends java.lang.Comparable<? super T>>, T)

    private static <T>
    int indexedBinarySearch(List<? extends Comparable<? super T>> list, T key) {
        int low = 0;
        int high = list.size()-1;
​
        while (low <= high) {
            int mid = (low + high) >>> 1; //>>>:無符號右移,忽略符號位,空位都以0補齊
            Comparable<? super T> midVal = list.get(mid);
            int cmp = midVal.compareTo(key);
​
            if (cmp < 0)
                low = mid + 1;
            else if (cmp > 0)
                high = mid - 1;
            else
                return mid; // key found
        }
        return -(low + 1);  // key not found
    }

 

福利2:

冒泡排序:

    /**
     * 冒泡排序:升序
     *
     * @param sourceList
     */
    public void bubbleSort(List<Integer> sourceList) {
        if (sourceList == null || sourceList.isEmpty()) {
            return;
        }
        for (int i = 0; i < sourceList.size(); i++) {
            for (int j = 0; j < sourceList.size() - 1 - i; j++) {
                if (sourceList.get(j) > sourceList.get(j + 1)) {
                    int tmp = sourceList.get(j);
                    sourceList.set(j, sourceList.get(j + 1));
                    sourceList.set(j + 1, tmp);
                }
            }
        }
    }

完成代碼見:
StackDemoExam.java

 https://github.com/helloworldtang/spring-boot-cookbook/blob/v1.0.3-19.1.12/learning-demo/src/main/java/com/tangcheng/learning/exam/SearchExam.java

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM