算法
1. LBS(最长公共子串)
子串不要求连续(如 ABCBDAB和BDCABA的最长公共子串是 BCBA和BDAB)
动态规划问题。动态规划算法解最长公共子序列LCS问题
1 public class LCS { 2 public static void main(String[] args) { 3 String x = "ABCBDAB"; 4 String y = "BDCABA"; 5 int substringLength1 = x.length(); 6 int substringLength2 = y.length(); 7 8 Long startTime = System.nanoTime(); 9 10 int[][] opt = new int[substringLength1 + 1][substringLength2 + 1];// 构造二维数组记录子问题x[i]和y[i]的LCS的长度 11 12 // 动态规划计算所有子问题 13 for (int i = substringLength1 - 1; i >= 0; i--) { 14 for (int j = substringLength2 - 1; j >= 0; j--) { 15 if (x.charAt(i) == y.charAt(j)) 16 opt[i][j] = opt[i + 1][j + 1] + 1; 17 else 18 opt[i][j] = Math.max(opt[i + 1][j], opt[i][j + 1]); 19 } 20 } 21 22 System.out.print("LCS:"); 23 24 int i = 0, j = 0; 25 while (i < substringLength1 && j < substringLength2) { 26 if (x.charAt(i) == y.charAt(j)) { 27 System.out.print(x.charAt(i)); 28 i++; 29 j++; 30 } else if (opt[i + 1][j] >= opt[i][j + 1]) 31 i++; 32 else 33 j++; 34 } 35 36 Long endTime = System.nanoTime(); 37 System.out.println("\nTotle time is " + (endTime - startTime) + " ns"); 38 } 39 }
2. 找到数组中出现次数超过一半的数字(前提是:数组中一定存在某个数超过数组长度的一半)
问题描述:
输入:一个最多含有n个不重复的正整数(也就是说可能含有少于n个不重复正整数)的文件,其中每个数都小于等于n,且n=10^7。
输出:得到按从小到大升序排列的包含所有输入的整数的列表。
条件:最多有大约1MB的内存空间可用,但磁盘空间足够。且要求运行时间在5分钟以下,10秒为最佳结果。
4. 字符串左移,void *pszStringRotate(char *pszString, int nCharsRotate),比如ABCDEFG,移3位变DEFGABC,要求空间复杂度O(1),时间复杂度O(n)
先把翻转前n-3个 然后翻转后3个 也可以先后后前 如 ABCDEFG -> DCBA GFE -> EFGABCD 这样就OK了 来自《编程艺术》
5.
6.