最长子串和分配苹果问题
1.找两个字符串的最长公共子串
这题用动态规划,使用一个长宽为两字符串长度加1的dp数组。转换条件式见代码。
public class Main {public static void main(String[] args) {Scanner in=new Scanner(System.in);String s1=in.next();String s2 = in.next();System.out.println(helper(s1, s2));}private static String helper(String s1, String s2) {int m=s1.length(),n=s2.length();int[][] dp=new int[m+1][n+1];int max=0,end=0;for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {if(s1.charAt(i)==s2.charAt(j)){dp[i][j]=dp[i-1][j-1]+1;if(dp[i][j]>max){max=dp[i][j];end=i;}}}}return s1.substring(end-max,end);}
}
2.把m个苹果分给n个人求分配方案
这个直接回溯,dfs(remain,n),同时注意i<=remain
public class Main {static List<Integer> list=new ArrayList<>();static List<List<Integer>> res=new ArrayList<>();public static void main(String[] args) {Scanner in=new Scanner(System.in);int m = in.nextInt();int n = in.nextInt();dfs(m,n);res.forEach(i->{i.forEach(e -> System.out.print(e + " "));System.out.println();});System.out.println(res.size());}//第一个参数m是还剩的苹果private static void dfs(int m, int n) {//还剩最后一个结束,将最后一个加给链表if(list.size()==n-1){List<Integer> temp=new ArrayList<>(list);temp.add(m);res.add(new ArrayList<>(temp));return;}for (int i = 0; i <= m; i++) {list.add(i);dfs(m-i,n);list.remove(list.size()-1);}}}