这个专栏 我将分享每日做的算法题的解题思路 秋招加油!
这是第六天 !!
017 含有所有字符的最短字符串
题目
AC代码
class Solution {
public String minWindow(String s, String t) {
if (s.length() < t.length()) {
return "";
}
String result = "";
int length = s.length();
int[] cnt1 = new int[100];
int[] cnt2 = new int[100];
for (int i = 0; i < t.length(); i++) {
cnt1[t.charAt(i) - 'A']++;
}
int left = 0, right = 0;
while (right < s.length()) {
cnt2[s.charAt(right) - 'A']++;
while(check(cnt1, cnt2) && left<=right) {
if (right - left + 1 <= length) {
length =right -left + 1;
result = s.substring(left,right+1);
}
cnt2[s.charAt(left)-'A']--;
left++;
}
right++;
}
return result;
}
public boolean check(int[] c1, int[] c2) {
for (int i = 0; i < 100; i++) {
if (c2[i] < c1[i]) {
return false;
}
}
return true;
}
}
这道题可以通过滑动窗口解决,当没有符合条件时,右边界不断扩大,左边界不变,当符合条件时,开始收缩左边界,找到当前符合的最小值,直至遍历结束。
018 有效的回文
题目
AC代码
class Solution {
public boolean isPalindrome(String s) {
StringBuilder str1 = new StringBuilder();
for(int i = 0;i<s.length();i++){
if(s.charAt(i)<='Z' && s.charAt(i)>='A'){
str1.append(Character.toLowerCase(s.charAt(i)));
}
else if(s.charAt(i)<='z' && s.charAt(i)>='a' || s.charAt(i)<='9' && s.charAt(i)>='0'){
str1.append(s.charAt(i));
}
}
return str1.toString().equals(str1.reverse().toString());
}
}
只需要对字符串筛选+判断即可,大写字符转小写,去除其他字符。
019 最多删除一个字符得到回文
题目
AC代码
class Solution {
public boolean validPalindrome(String s) {
StringBuilder str = new StringBuilder();
str.append(s);
if(str.toString().equals(str.reverse().toString())){
return true;
}
int left = 0,right = s.length()-1;
while(left<=right){
if(str.charAt(left) == str.charAt(right)){
left++;
right--;
}
else if(check(str.substring(left+1,right+1)) || check(str.substring(left,right))){
return true;
}
else{
return false;
}
}
return false;
}
public boolean check(String str1){
StringBuilder s1 = new StringBuilder();
s1.append(str1);
if(s1.toString().equals(s1.reverse().toString())){
return true;
}
return false;
}
}
前后开始判断,当出现不同时,直接对里面的字符串判断,如果不是回文,则返回false,否则返回true。
020 回文子字符串的个数
题目
AC代码
class Solution {
public int countSubstrings(String s) {
int result = 0;
for (int i = 0; i < s.length(); i++) {
for(int j = i+1;j<=s.length();j++){
if(check(s.substring(i,j))){
result++;
}
}
}
return result;
}
public boolean check(String str1){
StringBuilder s1 = new StringBuilder();
s1.append(str1);
if(s1.toString().equals(s1.reverse().toString())){
return true;
}
return false;
}
}
截取字符串 + 判断是否回文
“放弃”二字15笔, “坚持”二字16笔, 放弃和坚持就在一笔之差! 差之毫厘,失之千里。 无论你睡多晚, 总有人比你更晚。 无论你起多早, 总有人比你更早。 无论你多努力, 总有人比你更努力。 不管你有多辛苦, 总有人比你更辛苦。 所以要持之以恒, 坚持就是胜利。