String Notes
概述
1. Char Removal
input: ____aaa___bb_cc__
output: aaa_bb_cc
即去掉input string的首位空格,并且每个词之前只保留一个空格。 input: ____aaa___bb_cc__
output: aaa_bb_cc
即去掉input string的首位空格,并且每个词之前只保留一个空格。 public class Solution {
public String removeSpaces(String input) {
char[] arr = input.toCharArray();
int i = -1, j = 0;
// 如果见到单词,则设为true,如果见到空格且flag为true,表示刚离开单词,补空格
boolean flag = false;
for (j = 0; j < arr.length; ++j) {
if (arr[j] != ' ') {
flag = true;
arr[++i] = arr[j];
} else if (flag) {
// 刚离开一个单词
arr[++i] = ' ';
flag = false;
}
}
if (i == -1) return "";
StringBuilder sb = new StringBuilder();
// 如果input以空格结尾,此时 i 指向最后一个多余空格,否则指向最后一个字母
for (int k = 0; k <= i; ++k) {
sb.append(arr[k]);
}
if (sb.charAt(sb.length() - 1) == ' ') sb.deleteCharAt(sb.length() - 1);
return sb.toString();
}
} (1)
input: aaa_bb_cc
return: a_b_c (2)
input: abbacd
output: cd
即重复串消除之后,如果左右部分合并生成了新的重复串,继续消除 public class Solution {
public String deDup(String input) {
Deque<Character> stack = new ArrayDeque<>();
int idx = 0;
boolean dup = false;
while (idx < input.length()) {
if (stack.isEmpty()) {
stack.offerLast(input.charAt(idx++));
} else if (stack.peekLast() == input.charAt(idx)) {
idx++;
dup = true;
} else {
if (dup) {
stack.pollLast();
dup = false;
} else {
stack.offerLast(input.charAt(idx++));
}
}
}
if (dup) {
stack.pollLast();
}
StringBuilder sb = new StringBuilder();
for (char c : stack) {
sb.append(c);
}
return sb.toString();
}
} (3). Remove Spaces, delete leading/trailing/duplicated spaces
“ a” --> “a”
“ I love MTV ” --> “I love MTV” public class Solution {
public String removeSpaces(String input) {
StringBuilder sb = new StringBuilder();
boolean space = false;
char[] arr = input.toCharArray();
// pass all spaces, add a space after each word
for (char c : arr) {
if (c == ' ') {
space = true;
continue;
} else {
if (space) {
sb.append(" ");
space = false;
}
sb.append(c);
}
}
// delete leading/trailing space
if (sb.length() == 0) return "";
if (sb.charAt(0) == ' ') {
sb.deleteCharAt(0);
}
if (sb.charAt(sb.length() - 1) == ' ') {
sb.deleteCharAt(sb.length() - 1);
}
return sb.toString();
}
} public class Solution {
public int strstr(String large, String small) {
if ("".equals(small)) return 0;
for (int k = 0; k < large.length(); ++k) {
int i = 0;
while (i < small.length() && k + i < large.length()) {
if (large.charAt(k + i) != small.charAt(i)) break;
i++;
}
if (i == small.length()) return k;
}
return -1;
}
} Assumptions
input, S and T are not null, S is not empty string
Examples
input = "appledogapple", S = "apple", T = "cat", input becomes "catdogcat"
input = "dodododo", S = "dod", T = "a", input becomes "aoao" public class Solution {
public String replace(String input, String s, String t) {
int r = 0;
StringBuilder sb = new StringBuilder();
while (r < input.length()) {
if (match(input, s, r)) {
sb.append(t);
r += s.length();
} else {
sb.append(input.charAt(r++));
}
}
return sb.toString();
}
private boolean match(String input, String s, int start) {
if (start + s.length() - 1 >= input.length()) return false;
int i = 0;
while (i < s.length()) {
if (input.charAt(start + i) != s.charAt(i)) return false;
i++;
}
return true;
}
} class Solution {
public int compress(char[] chars) {
int l = -1, r = 0;
while (r < chars.length) {
int num = count(chars, r);
chars[++l] = chars[r]; // 先复制字母,然后添加数字
if (num > 1) {
// 从 l+1 开始添加数字,并且更新l的值,为数字最后一位的index
l = insertNumber(chars, l + 1, num);
}
r += num;
}
return l + 1;
}
// insert given number in chars at start, return new left pointer
private int insertNumber(char[] chars, int start, int num) {
String numString = String.valueOf(num);
for (int i = 0; i < numString.length(); ++i) {
chars[start + i] = numString.charAt(i);
}
return start + numString.length() - 1;
}
// 返回连续出现的个数
private int count(char[] chars, int start) {
int ret = 1;
char c = chars[start];
start += 1;
while (start < chars.length) {
if (chars[start++] == c) ret++;
else break;
}
return ret;
}
} input: ABCDE12345
output: A1B2C3D4E5