392、判断子序列
给定字符串 s 和 t ,判断 s 是否为 t 的子序列。
字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。
涨知识了:双指针——>一个快指针,一个慢指针,快指针用在t上,慢指针用在s上。
class Solution {
public boolean isSubsequence(String s, String t) {
//没有想到双指针可以用在两个字符串中
int n = s.length(), m = t.length();
int i = 0, j = 0;
while (i < n && j < m) {
if (s.charAt(i) == t.charAt(j)) {
i++;
}
j++;
}
return i == n;
}
}
法二:利用indexOf
注意:示例 "ab" "abbab" 返回true
并不能直接使用indexOf,而是应该设定查找indexOf的范围,s的第一个字符是从t的全部查找,一旦找到s的第一个字符的位置【设为X】后,那么s的剩下的字符都应该在X的后面找
class Solution {
public boolean isSubsequence(String s, String t) {
int index = -1;
for (char c : s.toCharArray()){
index = t.indexOf(c, index+1);
if (index == -1) return false;
}
return true;
}
}
720、词典中最长的单词
给出一个字符串数组 words
组成的一本英语词典。返回 words
中最长的一个单词,该单词是由 words
词典中其他单词逐步添加一个字母组成。若其中有多个可行的答案,则返回答案中字典序最小的单词。若无答案,则返回空字符串。
注意审题
①由 words
词典中其他单词逐步添加一个字母组成。————我没看见!!!o(╥﹏╥)o
②刚开始的时候要判断排序后的第一个字符串的长度是否为1,而不是直接set.add(s)。因为题目只说这个单词是逐步添加一个字母组成的,但是并没有说刚开始的时候是从一个字母逐渐变成一个单词的 ,有可能排序后的第一个字符串的长度是2
class Solution {
public String longestWord(String[] words) {
Arrays.sort(words);
Set<String>set=new HashSet<>();
String ans="";
for(int i=0;i< words.length;i++){
String s=words[i];
if(s.length()==1||set.contains(s.substring(0,s.length()-1))){
// ans = ans.length() > s.length() ? ans : s; 注意这里的判断不能是这一句话
//因为我们要输出apple 而不是apply 如果是上面一句三元式判断的话,当s=apply时,ans这时候为apply
//这时ans.length==s.length 输出的是s.故不符合题目要求
ans = s.length() > ans.length() ? s:ans;//这句才是对的
set.add(s);
}
}
return ans;
}
}
796、旋转字符串
给定两个字符串, s 和 goal。如果在若干次旋转操作之后,s 能变成 goal ,那么返回 true 。s 的 旋转操作 就是将 s 最左边的字符移动到最右边。 例如, 若 s = 'abcde',在旋转一次之后结果就是'bcdea' 。
这个结论在:Day27:459的笔记里
class Solution {
public boolean rotateString(String s, String goal) {
//看过进阶版的
if(s.length()!=goal.length()) return false;//细节注意
String ans=s+s;
if(ans.contains(goal)){
return true;
}
return false;
}
}