1、基础知识
Character
常见方法
序号 | 方法与描述 |
---|---|
1 | isLetter() 是否是一个字母 |
2 | isDigit() 是否是一个数字字符 |
3 | isWhitespace() 是否是一个空白字符 |
4 | isUpperCase() 是否是大写字母 |
5 | isLowerCase() 是否是小写字母 |
6 | toUpperCase() 指定字母的大写形式 |
7 | toLowerCase() 指定字母的小写形式 |
8 | toString() 返回字符的字符串形式,字符串的长度仅为1 |
String
构造方法
常见方法
创建格式化字符串
Java格式化输出(包括对printf,print,println,format等的介绍)_韩跳跳、的博客-CSDN博客_java格式化输出
Java StringBuffer 和 StringBuilder 类
Java StringBuffer 和 StringBuilder 类 | 菜鸟教程
由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。
StringBuffer str;
str.toString();
str.append(char ch);
常用方法
序号 | 方法描述 |
---|---|
1 | public StringBuffer append(String s) 将指定的字符串追加到此字符序列。 |
2 | public StringBuffer reverse() 将此字符序列用其反转形式取代。 |
3 | public delete(int start, int end) 移除此序列的子字符串中的字符。 |
4 | public insert(int offset, int i) 将 int 参数的字符串表示形式插入此序列中。 |
5 | insert(int offset, String str) 将 str 参数的字符串插入此序列中。 |
6 | replace(int start, int end, String str) 使用给定 String 中的字符替换此序列的子字符串中的字符。 |
序号 | 方法描述 |
---|---|
1 | int capacity() 返回当前容量。 |
2 | char charAt(int index) 返回此序列中指定索引处的 char 值。 |
3 | void ensureCapacity(int minimumCapacity) 确保容量至少等于指定的最小值。 |
4 | void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 将字符从此序列复制到目标字符数组 dst 。 |
5 | int indexOf(String str) 返回第一次出现的指定子字符串在该字符串中的索引。 |
6 | int indexOf(String str, int fromIndex) 从指定的索引处开始,返回第一次出现的指定子字符串在该字符串中的索引。 |
7 | int lastIndexOf(String str) 返回最右边出现的指定子字符串在此字符串中的索引。 |
8 | int lastIndexOf(String str, int fromIndex) 返回 String 对象中子字符串最后出现的位置。 |
9 | int length() 返回长度(字符数)。 |
10 | void setCharAt(int index, char ch) 将给定索引处的字符设置为 ch 。 |
11 | void setLength(int newLength) 设置字符序列的长度。 |
12 | CharSequence subSequence(int start, int end) 返回一个新的字符序列,该字符序列是此序列的子序列。 |
13 | String substring(int start) 返回一个新的 String ,它包含此字符序列当前所包含的字符子序列。 |
14 | String substring(int start, int end) 返回一个新的 String ,它包含此序列当前所包含的字符子序列。 |
15 | String toString() 返回此序列中数据的字符串表示形式。 |
2、基本题型
(1)滑动窗口(同向双指针)-变位词
滑动窗口+哈希表【小写字母26个,ASCII码256个,可以用数组记录】
class Solution {
public boolean checkInclusion(String s1, String s2) {
int n = s1.length(), m = s2.length();
if (n > m) {
return false;
}
int[] cnt1 = new int[26];
int[] cnt2 = new int[26];
for (int i = 0; i < n; ++i) {
++cnt1[s1.charAt(i) - 'a'];
++cnt2[s2.charAt(i) - 'a'];
}
if (Arrays.equals(cnt1, cnt2)) {
return true;
}
for (int i = n; i < m; ++i) {
++cnt2[s2.charAt(i) - 'a'];
--cnt2[s2.charAt(i - n) - 'a'];
if (Arrays.equals(cnt1, cnt2)) {
return true;
}
}
return false;
}
}
class Solution {
public List<Integer> findAnagrams(String s, String p) {
int sLen = s.length(), pLen = p.length();
if (sLen < pLen) {
return new ArrayList<Integer>();
}
List<Integer> ans = new ArrayList<Integer>();
int[] sCount = new int[26];
int[] pCount = new int[26];
for (int i = 0; i < pLen; ++i) {
++sCount[s.charAt(i) - 'a'];
++pCount[p.charAt(i) - 'a'];
}
if (Arrays.equals(sCount, pCount)) {
ans.add(0);
}
for (int i = 0; i < sLen - pLen; ++i) {
--sCount[s.charAt(i) - 'a'];
++sCount[s.charAt(i + pLen) - 'a'];
if (Arrays.equals(sCount, pCount)) {
ans.add(i + 1);
}
}
return ans;
}
}
剑指 Offer II 016. 不含重复字符的最长子字符串
import java.util.*;
class Solution {
public int lengthOfLongestSubstring(String s) {
int[] map = new int[256];
int len = s.length();
if (len == 0) return 0;
int maxLen = 0;
for (int i = 0, j = 0; i < len; i++) {
while (i <= j && j < len && map[s.charAt(j)] < 1) {
map[s.charAt(j)] += 1;
maxLen = Math.max(maxLen, j - i + 1);
j++;
}
map[s.charAt(i)] -= 1;
}
return maxLen;
}
}
class Solution {
public String minWindow(String s, String t) {
int len1 = s.length();
int len2 = t.length();
if (len1 < len2) return "";
Set<Character> set = new HashSet<>();
int[] map = new int[256];
Arrays.fill(map,0);
for (int i = 0; i < len2; i++) {
map[t.charAt(i)]++;
if (!set.contains(t.charAt(i))) {
set.add(t.charAt(i));
}
}
int kindNum = set.size();
int maxI = 0;
int minJ = 0;
int i = 0, j = 0;
int minLen = Integer.MAX_VALUE;
while (j < len1 || (kindNum == 0 && j == len1)) {
if (kindNum > 0) {
if (set.contains(s.charAt(j))) {
map[s.charAt(j)]--;
if (map[s.charAt(j)] == 0) {
kindNum--;
}
}
j++;
} else {
if (j - i < minLen) {
minLen = j - i;;
maxI = i;
minJ = j;
}
if (set.contains(s.charAt(i))) {
map[s.charAt(i)]++;
if (map[s.charAt(i)] == 1) {
kindNum++;
}
}
i++;
}
}
return minLen < Integer.MAX_VALUE ? s.substring(maxI, minJ) : "";
}
}
(2)回文字符串(反向双指针)
class Solution {
public boolean isPalindrome(String s) {
int i = 0;
int j = s.length() - 1;
while (i < j) {
//跳过非数字、非字母字符
char ch1 = s.charAt(i);
char ch2 = s.charAt(j);
if (!Character.isLetterOrDigit(ch1)) {
i++;
} else if (!Character.isLetterOrDigit(ch2)) {
j--;
} else {
ch1 = Character.toLowerCase(ch1);
ch2 = Character.toLowerCase(ch2);
if (ch1 != ch2) {
return false;
}
i++;
j--;
}
}
return true;
}
}
public boolean validPalindrome(String s) {
int i = 0, j = s.length() - 1;
while (i < j && s.charAt(i) == s.charAt(j)) {
i++;
j--;
}
return i == s.length() / 2 + 1 || isPalindrome(s,i,j-1) || isPalindrome(s,i+1,j);
}
private static boolean isPalindrome(String s, int start, int end) {
while (start < end) {
if (s.charAt(start) != s.charAt(end)) {
return false;
}
start++;
end--;
}
return true;
}
-
-
双指针
-
马拉车算法
-
public int countSubstrings(String s) {
int count = 0;
for (int i = 0; i < s.length(); i++) {
count += countPalindrome(s, i, i);
count += countPalindrome(s, i, i + 1);
}
return count;
}
private int countPalindrome(String s, int start, int end) {
int count = 0;
int i = start, j = end;
while (i >= 0 && j < s.length() && s.charAt(i) == s.charAt(j)) {
count++;
i--;
j++;
}
return count;
}