541. 反转字符串 II
给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例:
输入: s = "abcdefg", k = 2
输出: "bacdfeg"
提示:
该字符串只包含小写英文字母。
给定字符串的长度和 k 在 [1, 10000] 范围内。
public String reverseStr(String s, int k) {
char[] chars = s.toCharArray();
//每隔2k个进行处理
for (int start = 0; start <chars.length ; start+=2*k) {
int i=start;
int j=Math.min(start+k-1,chars.length-1);
while(i<j){
char temp=chars[i];
chars[i]=chars[j];
chars[j]=temp;
i++;
j--;
}
}
return new String(chars);
}
151. 翻转字符串里的单词
给你一个字符串 s ,逐个翻转字符串中的所有 单词 。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。
说明:
输入字符串 s 可以在前面、后面或者单词间包含多余的空格。
翻转后单词间应当仅用一个空格分隔。
翻转后的字符串中不应包含额外的空格。
public String reverseWords(String s) {
s=s.trim();//去除首位多余空格
String[] split =s.split(" +");//" +"表示一个或多个空格
Collections.reverse(Arrays.asList(split));//String[] 变为list进行反转
return String.join(" ", split);
//String.Join 方法 (A (String), B (String[]));
//在指定 String 数组B的每个元素之间串联指定的分隔符 A,从而产生单个串联的字符串
}
28. 实现 strStr()
实现 strStr() 函数。
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。
说明:
当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。
法一:
public int strStr(String haystack, String needle) {
int n = haystack.length();
int m = needle.length();
for (int i = 0; i + m <= n; i++) {
boolean flag = true;
for (int j = 0; j < m; j++) {
if (needle.charAt(j) != haystack.charAt(i + j)) {
flag = false;
break;
}
}
if (flag) {
return i;
}
}
return -1;
}
法二:
public int strStr(String haystack, String needle) {
int L=needle.length();
for (int i = 0; i <haystack.length()-L+1 ; i++) {
if(haystack.substring(i,i+L).equals(needle)){
return i;
}
}
return -1;
}
法三:KMP算法
KMP的经典思想是:
当出现字符串不匹配时,可以记录一部分之前已经匹配的文本内容,
利用这些信息避免从头再去做匹配。
根据模式串写一个前缀表
前缀表是用来回退的,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配。
459. 重复的子字符串
给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。
public boolean repeatedSubstringPattern(String s) {
int n=s.length();
//这里是n/2缩小范围
for (int i = 1; i <= n/2 ; i++) {
if(n%i==0){
boolean flag=true;
for (int j = i; j <n ; j++) {
if(s.charAt(j)!=s.charAt(j-i)){
flag=false;
break;
}
}
if(flag){
return true;
}
}
}
return false;
}