392. 判断子序列
【题目】判断s字符串是不是t字符串的子序列
【分析】遍历t字符串的同时,增加一个游标来标记s字符串的位置,若遇到相等的则二者都向前索引,同时判断s是不是到头。
【拓展】该题目是可以利用最长公共子序列来求解的,判断最长公共子序列和s字符串是不是相等就行了。
class Solution {public boolean isSubsequence(String s, String t) {if (s.length() == 0) return true;if (s.length() > t.length()) return false;int sIndex = 0;for (int i=0; i<t.length(); i++) {if (s.charAt(sIndex) == t.charAt(i)) {sIndex++;if (sIndex == s.length()) return true;}}return false;}}
//拓展class Solution {public boolean isSubsequence(String s, String t) {if (s.length() == 0) return true;if (s.length() > t.length()) return false;return longestCommonSubsequence(s, t) == s.length();}public int longestCommonSubsequence(String text1, String text2) {int m = text1.length();int n = text2.length();int[][] dp = new int[m+1][n+1]; //text1[0:i)和text2[0:j)的最长公共子序列长度for (int i=1; i<=m; i++) {for (int j=1; j<=n; j++) {if (text1.charAt(i-1) == text2.charAt(j-1)) {dp[i][j] = dp[i-1][j-1] + 1;} else {dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);}}}return dp[m][n];}}
491. 递增子序列
【题目】给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是 2 。
【分析】使用递归+回溯的思路找到子序列的所有递增子序列,因为是子序列问题,所以,当前元素是可加可不加的,所以就出现了下面的两种递归。
class Solution {List<List<Integer> > res = new LinkedList<>();public List<List<Integer>> findSubsequences(int[] nums) {LinkedList<Integer> temp = new LinkedList<>();dfs(nums, temp, 0, -101);return res;}public void dfs(int[] nums, LinkedList<Integer> temp, int cur, int preNum) {//递归+回溯if (cur == nums.length) {if (temp.size() >= 2) {res.add(new LinkedList<>(temp));}return;}//以下两种情况都要执行到//1. 选择该元素if (nums[cur] >= preNum) {temp.add(nums[cur]);dfs(nums, temp, cur+1, nums[cur]);temp.removeLast();}//2. 不选择该元素,加入判等是为了避免出现重复if (nums[cur] != preNum) {dfs(nums, temp, cur+1, preNum);}}}
