字符串
1.字符串常用操作
字符串长度
String.length()
字符串查找
String提供了两种查找字符串的方法,即indexOf与lastIndexOf方法。
1、indexOf(String s)
该方法用于返回参数字符串s在指定字符串中首次出现的索引位置,当调用字符串的indexOf()方法时,会从当前字符串的开始位置搜索s的位置;如果没有检索到字符串s,该方法返回-1
String str ="We are students";
int size = str.indexOf("a"); // 变量size的值是3
2、lastIndexOf(String str)
该方法用于返回字符串最后一次出现的索引位置。当调用字符串的lastIndexOf()方法时,会从当前字符串的开始位置检索参数字符串str,并将最后一次出现str的索引位置返回。如果没有检索到字符串str,该方法返回-1.
如果lastIndexOf方法中的参数是空字符串"" ,,则返回的结果与length方法的返回结果相同。
获取指定索引位置的字符
使用charAt()方法可将指定索引处的字符返回。
String str = "hello word";
char mychar = str.charAt(5); // mychar的结果是w
获取子字符串
通过String类的substring()方法可对字符串进行截取。这些方法的共同点就是都利用字符串的下标进行截取,且应明确字符串下标是从0开始的。在字符串中空格占用一个索引位置。
1、substring(int beginIndex)
该方法返回的是从指定的索引位置开始截取知道该字符串结尾的子串。
String str = "Hello word";
String substr = str.substring(3); //获取字符串,此时substr值为lo word
2、substring(int beginIndex, int endIndex)
beginIndex : 开始截取子字符串的索引位置
endIndex:子字符串在整个字符串中的结束位置
String str = "Hello word";
String substr = str.substring(0,3); //substr的值为hel
去除空格
trim()方法返回字符串的副本,忽略前导空格和尾部空格。
字符串替换
replace()方法可实现将指定的字符或字符串替换成新的字符或字符串
oldChar:要替换的字符或字符串
newChar:用于替换原来字符串的内容
如果要替换的字符oldChar在字符串中重复出现多次,replace()方法会将所有oldChar全部替换成newChar。需要注意的是,要替换的字符oldChar的大小写要与原字符串中字符的大小写保持一致。
1 String str= "address";
2 String newstr = str.replace("a", "A");// newstr的值为Address
判断字符串的开始与结尾
startsWith()方法与endsWith()方法分别用于判断字符串是否以指定的内容开始或结束。这两个方法的返回值都为boolean类型。
1、startsWith(String prefix)
该方法用于判断当前字符串对象的前缀是否是参数指定的字符串。
2、endsWith(String suffix)
该方法用于判断当前字符串是否以给定的子字符串结束
判断字符串是否相等
1、equals(String otherstr)
如果两个字符串具有相同的字符和长度,则使用equals()方法比较时,返回true。同时equals()方法比较时区分大小写。
2、equalsIgnoreCase(String otherstr)
equalsIgnoreCase()方法与equals()类型,不过在比较时忽略了大小写。
按字典顺序比较两个字符串
compareTo()方法为按字典顺序比较两个字符串,该比较基于字符串中各个字符的Unicode值,按字典顺序将此String对象表示的字符序列与参数字符串所表示的字符序列进行比较。如果按字典顺序此String对象位于参数字符串之前,则比较结果为一个负整数;如果按字典顺序此String对象位于参数字符串之后,则比较结果为一个正整数;如果这两个字符串相等,则结果为0.
str.compareTo(String otherstr);
字母大小写转换
字符串的toLowerCase()方法可将字符串中的所有字符从大写字母改写为小写字母,而tuUpperCase()方法可将字符串中的小写字母改写为大写字母。
str.toLowerCase();
str.toUpperCase();
字符串分割
使用split()方法可以使字符串按指定的分隔字符或字符串对内容进行分割,并将分割后的结果存放在字符数组中。
str.split(String sign);
sign为分割字符串的分割符,也可以使用正则表达式。
没有统一的对字符串进行分割的符号,如果想定义多个分割符,可使用符号“|”。例如,“,|=”表示分割符分别为“,”和“=”。
str.split(String sign, in limit);
该方法可根据给定的分割符对字符串进行拆分,并限定拆分的次数。
字符串转数组
java.lang.String#toCharArray
2.刷题
2.1 有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。示例 1:
输入:s = "()"
输出:true
示例 2:输入:s = "()[]{}"
输出:true
示例 3:输入:s = "(]"
输出:false
示例 4:输入:s = "([)]"
输出:false
示例 5:输入:s = "{[]}"
输出:true提示:
1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成
2.1.1 思路解析:
- 找规律:先出现的左括号后匹配
- 模式识别:先进后出用
栈
- 遍历字符串,遇见左括号进栈,遇见右括号如果栈为空或者栈顶不为相同类型的左括号,则返回false;如果
2.1.2 题解
class Solution {
public boolean isValid(String s) {
if (s.length() % 2 == 1) {
return false;
}
Stack<Character> stack = new Stack<>();
for (char a : s.toCharArray()) {
if (a == '(' || a == '{' || a == '[') {
stack.push(a);
} else if (a == ')') {
if (stack.isEmpty() || stack.peek() != '(') {
return false;
}
stack.pop();
} else if (a == ']') {
if (stack.isEmpty() || stack.peek() != '[') {
return false;
}
stack.pop();
} else if (a == '}') {
if (stack.isEmpty() || stack.peek() != '{') {
return false;
}
stack.pop();
} else {
return false;
}
}
return stack.isEmpty();
}
}
更优解:为了加速判断括号的类型,我们可以使用哈希表
存储每一种括号。哈希表的键为右括号,值为相同类型的左括号。
class Solution {
public boolean isValid(String s) {
if (s.length() % 2 == 1) {
return false;
}
Stack<Character> stack = new Stack<>();
Map<Character, Character> pairs = new HashMap<>();
pairs.put(']', '[');
pairs.put(')', '(');
pairs.put('}', '{');
for (char a : s.toCharArray()) {
if (pairs.containsKey(a)) { // 遇到右括号进行括号匹配
if (stack.isEmpty() || stack.peek() != pairs.get(a)) {
return false;
}
stack.pop();
} else { // 遇到左括号入栈
stack.push(a);
}
}
return stack.isEmpty();
}
}
2.1.3 总结
- 判断括号的有效性都可以用
栈
来这一数据结构来解决; Character
是char
的包装类,- Stack
2.2 字符串的坐旋转
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
示例 1:
输入: s = "abcdefg", k = 2
输出: "cdefgab"
示例 2:输入: s = "lrloseumgh", k = 6
输出: "umghlrlose"限制:
1 <= k < s.length <= 10000
class Solution {
public String reverseLeftWords(String s, int n) {
// 解法一:StringBuilder.append()
StringBuilder tail = new StringBuilder();
for (int i = n; i < s.length(); i++) {
tail.append(s.charAt(i));
}
for (int i = 0; i < n; i++) {
tail.append(s.charAt(i));
}
return tail.toString();
}
public String reverseLeftWords2(String s, int n) {
// 解法二:字符串切片
return s.subString(n) + s.subString(0, n);
}
public String reverseLeftWords(String s, int n) {
// 解法三:字符串拼接
String res = "";
for (int i = n; i < s.length(); i++) {
res += s.charAt(i);
}
for (int i = 0; i < n; i++) {
res += s.charAt(i);
}
return res;
}
public String reverseLeftWords(String s, int n) {
// 解法三:利用取余简化
StringBuilder tail = new StringBuilder();
for (int i = n; i < n + s.length(); i++) {
tail.append(s.charAt(i % s.length()));
}
return tail.toString();
}
}
2.3 替换空格
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1:
输入:s = "We are happy."
输出:"We%20are%20happy."限制:
0 <= s 的长度 <= 10000
class Solution {
// 考察点:
// 1.String.replace(char oldChar, char newChar)、String.replace(String regex, String newString)
// 2.String与char[]的转换
// 3.StringBuilder.append(char chr)、StringBuilder与String的转换
public String replaceSpace2(String s) {
return s.replace(" ", "%20");
}
public String replaceSpace(String s) {
StringBuilder res = new StringBuilder();
for (char c : s.toCharArray()) {
if (c == ' ') {
res.append("%20");
} else {
res.append(c);
}
}
return res.toString();
}
}
3.常见算法模板
3.1 查找一个字符串中每个字符出现的次数
public int[] findCnt(String s) {
int[] cnt = new int[26]; // s中出现的全是小写字母
char[] sCharArray = s.toCharArray();
for (char chr : sCharArray) {
cnt[chr - 'a']++;
}
return cnt;
}