关于字符串的算法题
String 方法:
1、char charAt(int index)
charAt() 方法用于返回指定索引处的字符。索引范围为从 0 到 length() - 1
2、boolean equals(Object anObject)
String 类中重写了 equals() 方法用于比较两个字符串的内容是否相等
3、int indexOf(String str)
返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
4、int lastIndexOf(String str):
返回指定子字符串在此字符串中最右边出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
5、int length()
返回字符串长度
6、String replace(char searchChar, char newChar)
通过用 newChar 字符替换字符串中出现的所有 searchChar 字符,并返回替换后的新字符串。
7、String[] split(String regex)
根据匹配给定的正则表达式来拆分字符串。
注:. 、 $、 | 和 * 等转义字符,必须得加 \\
8、boolean startsWith(String prefix)
检测字符串是否以指定的前缀开始
9、String substring(int beginIndex)
返回字符串的子字符串,beginIndex -- 起始索引, 索引从 0 开始
10、char[] toCharArray()
将字符串转换为字符数组
11、boolean contains(String str)
判断字符串中是否包含指定的字符或字符串
12、boolean isEmpty()
用于判断字符串是否为空
相关算法题:
1、shift挪动
一次shift操作就是把一个单词的第一个挪到最后,单词有n位就最多挪n次,问可以和原单词相同几次。
如输入:byebye 输出:2
输入:abcd 输出:1
public class Test3 extends Thread implements Runnable { public static void main(String args[]) { int count = shiftCount("byebye"); System.out.println(count); } public static int shiftCount(String str) { int aLength = str.length(); if (aLength == 0) { return 0; } int count = 0; String cur = ""; for (int i = 1; i <= aLength; i++) { cur = str.substring(i) + str.substring(0,i); if (cur.equals(str)) { count++; } System.out.println(cur); } return count; } }
解析:
1、判断字符串为空的情况
2、创建一个字符串用于比对
3、使用substring方法截取字符串,判断字符串相同
2、回文排列
给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。
回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。
回文串不一定是字典当中的单词。
示例:
输入:"tactcoa" 输出:true(排列有"tacocat"、"atcocta",等等)
class Solution { public boolean canPermutePalindrome(String s) { Set<Character> set = new HashSet<>(); for (char ch : s.toCharArray()) { //set的add方法如果返回false,表示已经有了, //我们就把他删除 if (!set.add(ch)) { set.remove(ch); } } //最后判断set的长度是否小于等于1,如果等于1说明 //只有一个字符的个数是奇数,其他的都是偶数。如果 //等于0说明每个字符都是偶数,否则不可能构成回文字符串 return set.size() <= 1; } }
解析:
回文字符串有两种,一种是奇数的,类似于"abbba",一种是偶数的,类似于"abba"或者"aabbaa"。
偶数的我们好判断,只需要找出每个字符都是偶数就行了。但奇数的就不能使用这种方式了,其实仔细观察我们就能发现,如果是奇数的,那么字符串的所有字符中只有一个字符的个数是奇数,其他的都是偶数
3、重复的子字符串
给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。
示例 1:
输入: "abab"
输出: True
解释: 可由子字符串 "ab" 重复两次构成。
示例 2:
输入: "aba"
输出: False
示例 3:
输入: "abcabcabcabc"
输出: True
解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。)
class Solution { public boolean repeatedSubstringPattern(String s) { int n = s.length(); for (int i = 1; i * 2 <= n; ++i) { if (n % i == 0) { boolean match = true; for (int j = i; j < n; ++j) { if (s.charAt(j) != s.charAt(j - i)) { match = false; break; } } if (match) { return true; } } } return false; } }
解析: