1. 程式人生 > >LeetCode演算法練習( 無重複字元的最長子串)

LeetCode演算法練習( 無重複字元的最長子串)

本文內容:
1、我的正確解答
2、官方的解答:暫時沒有

1、我的正確解答

class Solution2 {
    /**
     * 思路:迴圈遍歷字串,找到所有滿足條件的字串,將這些字串的長度排序,找到最長的返回
     *
     * @param s
     * @return
     */
    public int lengthOfLongestSubstring(String s) {
        //空返回0
        if ("".equals(s) || s == null) {
            return 0;
        }
        //list用來存放,每一個滿足條件的子字串的長度
List list = new ArrayList(); //list2是一個臨時集合,用來存放每一次遍歷的獲取到的不重複字元 List list2 = new ArrayList(); //每一個滿足條件的子字串的長度 int len = 0; for (int i = 0; i < s.length(); i++) { int v = 0; len = 0; for (int j = i; j < s.length(); j++) { v = s.charAt(j); //如果當前字元已經被獲取過了,則跳出當前迴圈
if (list2.contains(v)) { break; } else { list2.add(v); len++; continue; } } list.add(len); //清空臨時集合 list2.clear(); } //將集合轉換成陣列,方便於排序
int[] arr = new int[list.size()]; for (int k = 0; k < arr.length; k++) { arr[k] = Integer.valueOf(String.valueOf(list.get(k))); } //用穩定的歸併排序,排序所有的子字串的長度 sort(arr, 0, arr.length - 1); //返回最大長度的子字串 return arr[arr.length - 1]; } public static int[] sort(int[] a, int head, int tail) { int mid = (head + tail) / 2; if (head < tail) { sort(a, head, mid); sort(a, mid + 1, tail); merge(a, head, mid, tail); } return a; } public static void merge(int[] a, int head, int mid, int tail) { int[] temp = new int[tail - head + 1]; int i = head; int j = mid + 1; int k = 0; while (i <= mid && j <= tail) { if (a[i] < a[j]) { temp[k++] = a[i++]; } else { temp[k++] = a[j++]; } } while (i <= mid) { temp[k++] = a[i++]; } while (j <= tail) { temp[k++] = a[j++]; } for (int x = 0; x < temp.length; x++) { a[x + head] = temp[x]; } } }