從物理學到計算機,再到硬件,再到人工智能!
藍橋杯備賽 (LintCode上刷的第十二題)
問題描述
給定字符串s和t,判斷s是否爲t的子序列。
你可以認爲在s和t中都只包含小寫字母。t可能是一個非常長(length ~= 500,000)的字符串,而s是一個較短的字符串(length <= 100)。
一個字符串的子序列是在原字符串中刪去一些字符(也可以不刪除)後,不改變剩餘字符的相對位置形成的新字符串(例如,"ace"是"abcde"的子序列而"aec"不是)。
樣例輸出
樣例1:
s = “abc”,t = “ahbgdc”
返回true。
樣例2:
s = “axc”,t = “ahbgdc”
返回false。
問題分析
沒有采用動態規劃的思想,直接遍歷一次原字符串t。遍歷到s的最後一個字符時,返回true;若遍歷到原字符串t的最後一個字符都沒能遍歷到s的最後一個字符串,返回false。
JAVA代碼實現
package DP;
public class isSubsequence1263_1113 {
/**
* 判斷s是否爲t的子序列
* @param s 需要判斷的字符串
* @param t 原字符串
* @return
*/
public static boolean isSubsequence(String s, String t) {
// 將字符串全部轉換成字符數組
char[] sc = s.toCharArray();
char[] tc = t.toCharArray();
boolean flag = false;
// 創建一個變量記錄sc數組的下標
int m = 0;
//遍歷原字符串tc的每一個元素
for (int i = 0; i < tc.length; i++) {
//當sc的元素與tc的元素相等時
if (sc[m] == tc[i]) {
//記錄sc數組下標的元素後移
m ++;
}
//當m移動到sc的最後一個元素,跳出循環
if (m == sc.length - 1) {
flag = true;
break;
}
}
return flag;
}
public static void main(String[] args) {
String s = "abc", t = "ahbgdc";
boolean flag = isSubsequence(s, t);
System.out.println(flag);
}
}