LeetCode151.翻转字符串里的单词
法一:利用stack实现
public static String reverseWords(String s) {
Stack<String> stack = new Stack<>();
int index=0;
//截取所有单词放入栈中
while(index<s.length()) {
//如果不是空格,将该单词放入stack中
if(s.charAt(index)!=' ') {
int j=index+1;
while(j<s.length()) {
if(s.charAt(j)==' ') {
break;
}
j++;
}
stack.push(s.substring(index,j));
index=j+1;
}else {
index++;
}
}
//输出所有单词
StringBuilder sb = new StringBuilder();
while(!stack.isEmpty()) {
sb.append(stack.pop());
if(stack.isEmpty()) {
break;
}
sb.append(" ");
}
return sb.toString();
}
法二:利用java自带函数实现
class Solution {
public String reverseWords(String s) {
// 除去开头和末尾的空白字符
s = s.trim();
// 正则匹配连续的空白字符作为分隔符分割
List<String> wordList = Arrays.asList(s.split("\\s+"));
Collections.reverse(wordList);
return String.join(" ", wordList);
}
}
55.右旋转字符串
法一:用java自带函数实现
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
Integer k = scan.nextInt();
scan.nextLine();
String s = scan.nextLine();
String s1 = s.substring(0, s.length()-k);
String s2 = s.substring(s.length()-k);
System.out.println(s2.concat(s1));
scan.close();
}
法二:三次反转
Leetcode28. 实现 strStr()
kmp模板:
public static int strStr(String haystack, String needle) {
//获取next数组
int[] next = new int[needle.length()];
int j=0;
next[0]=0;
for(int i=1;i<needle.length();i++) {
//当前缀和后缀不匹配时,并且j要大于0才能向前查找
while(j>0&&needle.charAt(i)!=needle.charAt(j)) {
j=next[j-1];
}
//当前缀和后缀匹配时,记录下当前的位置,所以是下标+1
if(needle.charAt(i)==needle.charAt(j)) {
j++;
}
next[i]=j;
}
//进行匹配
j = 0;
for (int i = 0; i < haystack.length(); i++) {
while (j > 0 && needle.charAt(j) != haystack.charAt(i))
j = next[j - 1];
if (needle.charAt(j) == haystack.charAt(i))
j++;
if (j == needle.length())
return i - needle.length() + 1;
}
return -1;
}
LeetCode459.重复的子字符串
public boolean repeatedSubstringPattern(String s) {
int[] next = new int[s.length()];
int j=0;
for(int i=1;i<s.length();i++) {
while(j>0&&s.charAt(i)!=s.charAt(j)) {
j=next[j-1];
}
if(s.charAt(i)==s.charAt(j)) {
j++;
}
next[i]=j;
}
//判断是否是重复字串,防止为0,自身余自身成立
if(next[s.length()-1]==0) {
return false;
}
if(s.length()%(s.length()-next[s.length()-1])==0) {
return true;
}
return false;
}