diff --git "a/src/main/java/algorithm_practice/LeetCode/code000/M005_\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.java" "b/src/main/java/algorithm_practice/LeetCode/code000/M005_\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.java" index f858a619..524e6a72 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code000/M005_\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code000/M005_\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.java" @@ -24,54 +24,69 @@ public class M005_最长回文子串 extends TestCase { @Test public void testCase() { -// String str = "tattarrattat"; String str = "cabaddabacdd"; System.out.println(maxLcpsLength(str)); + + String str2 = "tattarrattat"; + System.out.println(maxLcpsLength(str2)); + + String str3 = "babad"; + System.out.println(maxLcpsLength(str3)); + + String str4 = "cbbd"; + System.out.println(maxLcpsLength(str4)); + + } + + public String longestPalindrome(String s) { + + + return ""; } /** * Manacher算法: 最长回文字串的长度 - * - * 每个元素之间插入一个字符'#',抵消奇回文与偶回文的差别(任意字符都行,不会影响最终的计算结果) - * - pArr[i]:i位置上,所能扩到的最大回文半径 - * - maxRight:记录回文半径扫到最右位置的下一个位置。(即将到达的位置) - * - index:当pR更新的时候,此时回文中心的位置 + *

+ * 每个元素之间插入一个字符'#',抵消奇回文与偶回文的差别(任意字符都行,不会影响最终的计算结果) + * - pArr[i]:i位置上,所能扩到的最大回文半径 + * - maxRight:记录回文半径扫到最右位置的下一个位置。(即将到达的位置) + * - index:当pR更新的时候,此时回文中心的位置 */ private int maxLcpsLength(String str) { - if (str==null || str.length()==0){ + if (str == null || str.length() == 0) { return 0; } char[] strArr = str.toCharArray(); - int length = 2*strArr.length+1; + int length = 2 * strArr.length + 1; char[] charArr = new char[length]; - charArr[length-1] = '#'; + charArr[length - 1] = '#'; //字符串预处理 int cnt = 0; - for (int i = 0; i < length-1; ) { + for (int i = 0; i < length - 1; ) { charArr[i++] = '#'; charArr[i++] = strArr[cnt++]; } int MaxLen = Integer.MIN_VALUE; int[] pArr = new int[length]; //i位置上,所能扩到的最大回文半径 int maxRight = -1; //记录回文半径所能扫到最右位置。(maxRight = i+pArr[i]-1) - int index = -1; //当maxRight更新的时候,此时回文中心的位置 + int index = -1; //当maxRight更新的时候,此时回文中心的位置 for (int i = 0; i < length; i++) { - if (i < maxRight){ - pArr[i] = Math.min(pArr[2*index-i], maxRight-i); //看pArr[j]的长度 + if (i < maxRight) { + pArr[i] = Math.min(pArr[2 * index - i], maxRight - i); //看pArr[j]的长度 } else { pArr[i] = 1; //i在maxRight的右边,从1开始扩 } //尝试扩展 - while (i+pArr[i]=0 && charArr[i-pArr[i]]==charArr[i+pArr[i]]){ + while (i + pArr[i] < length && i - pArr[i] >= 0 && charArr[i - pArr[i]] == charArr[i + pArr[i]]) { pArr[i]++; } //尝试更新maxRight和index - if (i+pArr[i]>maxRight){ - maxRight = i+pArr[i]-1; + if (i + pArr[i] > maxRight) { + maxRight = i + pArr[i] - 1; index = i; } MaxLen = Math.max(MaxLen, pArr[i]); } - return MaxLen-1; //因为MaxLen为带有'#'的回文半径,所以不带'#'回文长度也就为MaxLen-1 + return MaxLen - 1; //因为MaxLen为带有'#'的回文半径,所以不带'#'回文长度也就为MaxLen-1 } } diff --git "a/src/main/java/algorithm_practice/LeetCode/code1000/E1071_\345\255\227\347\254\246\344\270\262\347\232\204\346\234\200\345\244\247\345\205\254\345\233\240\345\255\220.java" "b/src/main/java/algorithm_practice/LeetCode/code1000/E1071_\345\255\227\347\254\246\344\270\262\347\232\204\346\234\200\345\244\247\345\205\254\345\233\240\345\255\220.java" new file mode 100644 index 00000000..328e66a4 --- /dev/null +++ "b/src/main/java/algorithm_practice/LeetCode/code1000/E1071_\345\255\227\347\254\246\344\270\262\347\232\204\346\234\200\345\244\247\345\205\254\345\233\240\345\255\220.java" @@ -0,0 +1,81 @@ +package algorithm_practice.LeetCode.code1000; + +import common.util.StringUtil; +import junit.framework.TestCase; +import org.junit.Test; + +/* +对于字符串 S 和 T,只有在 S = T + ... + T(T 与自身连接 1 次或多次)时,我们才认定 “T 能除尽 S”。 +返回最长字符串 X,要求满足 X 能除尽 str1 且 X 能除尽 str2。 + +示例 1: + +输入:str1 = "ABCABC", str2 = "ABC" +输出:"ABC" +示例 2: + +输入:str1 = "ABABAB", str2 = "ABAB" +输出:"AB" +示例 3: + +输入:str1 = "LEET", str2 = "CODE" +输出:"" +  + +提示: + +1 <= str1.length <= 1000 +1 <= str2.length <= 1000 +str1[i] 和 str2[i] 为大写英文字母 + +来源:力扣(LeetCode) +链接:https://leetcode-cn.com/problems/greatest-common-divisor-of-strings +著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 +Created by nibnait on 2020-03-13 + */ +public class E1071_字符串的最大公因子 extends TestCase { + + @Test + public void testCase() { + String str1 = "ABCABC", str2 = "ABC"; + System.out.println(gcdOfStrings(str1, str2)); + + String str3 = "ABABAB", str4 = "ABAB"; + System.out.println(gcdOfStrings(str3, str4)); + + String str5 = "LEET", str6 = "CODE"; + System.out.println(gcdOfStrings(str5, str6)); + + String str7 = "aaa", str8 = ""; + System.out.println(gcdOfStrings(str7, str8)); + + String str9 = "", str0 = "aaa"; + System.out.println(gcdOfStrings(str9, str0)); + + + } + + public String gcdOfStrings(String str1, String str2) { + + String result = ""; + if (str1.isEmpty() || str2.isEmpty()) { + return result; + } + + if (!(str1 + str2).equals(str2 + str1)) { + return result; + } + + int gcd = gcd(str1.length(), str2.length()); + return str1.substring(0, gcd); + } + + private int gcd(int len1, int len2) { + if (len2 > len1) { + return len1 == 0 ? len2 : gcd(len1, len2 % len1); + } + return len2 == 0 ? len1 : gcd(len2, len1 % len2); + } + + +} diff --git "a/src/main/java/algorithm_practice/LeetCode/code300/M300_\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.java" "b/src/main/java/algorithm_practice/LeetCode/code300/M300_\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.java" new file mode 100644 index 00000000..c800ed35 --- /dev/null +++ "b/src/main/java/algorithm_practice/LeetCode/code300/M300_\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.java" @@ -0,0 +1,67 @@ +package algorithm_practice.LeetCode.code300; + +import junit.framework.TestCase; +import org.junit.Test; + +/* +给定一个无序的整数数组,找到其中最长上升子序列的长度。 + +示例: + +输入: [10,9,2,5,3,7,101,18] +输出: 4 +解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。 +说明: + +可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。 +你算法的时间复杂度应该为 O(n2) 。 +进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗? + + + +来源:力扣(LeetCode) +链接:https://leetcode-cn.com/problems/longest-increasing-subsequence +著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 +Created by nibnait on 2020-03-14 + */ +public class M300_最长上升子序列 extends TestCase { + + @Test + public void testCase() { + int[] nums = new int[]{10, 9, 2, 5, 3, 7, 101, 18}; + System.out.println(lengthOfLIS(nums)); + + } + + /** + * 动态规划 + */ + public int lengthOfLIS(int[] nums) { + + if (nums.length == 0) { + return 0; + } + + if (nums.length == 1) { + return 1; + } + + int maxLen = 0; + // dp[i]: 前i个数字的最长子序列的长度 + int[] dp = new int[nums.length]; + for (int i = 0; i < dp.length; i++) { + dp[i] = 1; + } + + for (int i = 1; i < nums.length; i++) { + for (int j = 0; j < i; j++) { + if (nums[i] > nums[j]) { + dp[i] = Math.max(dp[i], dp[j] + 1); + } + } + maxLen = Math.max(maxLen, dp[i]); + } + + return maxLen; + } +} diff --git a/src/main/java/algorithm_practice/README.md b/src/main/java/algorithm_practice/README.md index a70e3cdb..29cdfb70 100644 --- a/src/main/java/algorithm_practice/README.md +++ b/src/main/java/algorithm_practice/README.md @@ -22,7 +22,10 @@ split、正则匹配、 - [M093_复原IP地址](./LeetCode/code000/M093_复原IP地址.java) - [M151_翻转字符串里的单词](./LeetCode/code100/M151_翻转字符串里的单词.java) - [M060_第k个排列](./LeetCode/code000/M060_第k个排列.java) - + - [E1071_字符串的最大公因子](./LeetCode/code1000/E1071_字符串的最大公因子.java) + +## 数学 + - [E1071_字符串的最大公因子](./LeetCode/code1000/E1071_字符串的最大公因子.java) ## 树 ### 重建二叉树 diff --git a/src/main/test/localtest/SetTest.java b/src/main/test/localtest/SetTest.java deleted file mode 100644 index da465c1d..00000000 --- a/src/main/test/localtest/SetTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package localtest; - -import common.util.StringUtil; -import junit.framework.TestCase; -import org.apache.commons.collections4.CollectionUtils; -import org.junit.Test; - -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -/* - -Created by nibnait on 2020-01-14 - */ -public class SetTest extends TestCase { - - @Test - public void testCase() { - System.out.println(isRestaurantInGray(1l, ",")); - } - - private static boolean isRestaurantInGray(long restaurantId, String grayRestaurantIdStr) { - - if (StringUtil.isBlank(grayRestaurantIdStr)) { - return false; - } - - Set grayValues = Stream.of(grayRestaurantIdStr.split(",")) - .map(String::trim) - .collect(Collectors.toSet()); - - if (CollectionUtils.isNotEmpty(grayValues) && grayValues.contains("-1")) { - return true; - } - - return grayValues.contains(String.valueOf(restaurantId)); - } -} \ No newline at end of file diff --git a/src/main/test/practice/BS.java "b/src/main/test/practice/\344\272\214\345\210\206\346\237\245\346\211\276.java" similarity index 94% rename from src/main/test/practice/BS.java rename to "src/main/test/practice/\344\272\214\345\210\206\346\237\245\346\211\276.java" index 5b8b8709..f6ce08c9 100644 --- a/src/main/test/practice/BS.java +++ "b/src/main/test/practice/\344\272\214\345\210\206\346\237\245\346\211\276.java" @@ -6,7 +6,7 @@ /** * Created by nibnait on 2019-08-23 */ -public class BS extends TestCase { +public class 二分查找 extends TestCase { @Test public void testM() { diff --git "a/src/main/test/practice/\345\240\206\346\216\222\345\272\217.java" "b/src/main/test/practice/\345\240\206\346\216\222\345\272\217.java" new file mode 100644 index 00000000..2f4117c8 --- /dev/null +++ "b/src/main/test/practice/\345\240\206\346\216\222\345\272\217.java" @@ -0,0 +1,30 @@ +package practice; + +import common.util.SysOut; +import junit.framework.TestCase; +import org.junit.Test; + +/* + +Created by nibnait on 2020-01-26 + */ +public class 堆排序 extends TestCase { + + @Test + public void testCase() { + + // 73 为完全二叉树的根节点 + int[] nums = new int[]{73, 98, 27, 36, 77, 22, 6, 32, 83, 69}; + SysOut.printArray(nums); + + nums = heapSort(nums); + SysOut.printArray(nums); + + } + + private int[] heapSort(int[] nums) { + + return nums; + } + +}