Skip to content

Commit dc21529

Browse files
authored
增加目录
1 parent 36196ce commit dc21529

File tree

1 file changed

+180
-163
lines changed

1 file changed

+180
-163
lines changed

数据结构与算法/搞定BAT面试——几道常见的子符串算法题.md

Lines changed: 180 additions & 163 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,20 @@
1+
<!-- MarkdownTOC -->
2+
3+
- [说明](#说明)
4+
- [1. KMP 算法](#1-kmp-算法)
5+
- [2. 替换空格](#2-替换空格)
6+
- [3. 最长公共前缀](#3-最长公共前缀)
7+
- [4. 回文串](#4-回文串)
8+
- [4.1. 最长回文串](#41-最长回文串)
9+
- [4.2. 验证回文串](#42-验证回文串)
10+
- [4.3. 最长回文子串](#43-最长回文子串)
11+
- [4.4. 最长回文子序列](#44-最长回文子序列)
12+
- [5. 括号匹配深度](#5-括号匹配深度)
13+
- [6. 把字符串转换成整数](#6-把字符串转换成整数)
14+
15+
<!-- /MarkdownTOC -->
16+
17+
118
## 说明
219

320
- 本文作者:wwwxmu
@@ -36,34 +53,34 @@
3653
//https://www.weiweiblog.cn/replacespace/
3754
public class Solution {
3855

39-
/**
40-
* 第一种方法:常规方法。利用String.charAt(i)以及String.valueOf(char).equals(" "
41-
* )遍历字符串并判断元素是否为空格。是则替换为"%20",否则不替换
42-
*/
43-
public static String replaceSpace(StringBuffer str) {
44-
45-
int length = str.length();
46-
// System.out.println("length=" + length);
47-
StringBuffer result = new StringBuffer();
48-
for (int i = 0; i < length; i++) {
49-
char b = str.charAt(i);
50-
if (String.valueOf(b).equals(" ")) {
51-
result.append("%20");
52-
} else {
53-
result.append(b);
54-
}
55-
}
56-
return result.toString();
57-
58-
}
59-
60-
/**
61-
* 第二种方法:利用API替换掉所用空格,一行代码解决问题
62-
*/
63-
public static String replaceSpace2(StringBuffer str) {
64-
65-
return str.toString().replaceAll("\\s", "%20");
66-
}
56+
/**
57+
* 第一种方法:常规方法。利用String.charAt(i)以及String.valueOf(char).equals(" "
58+
* )遍历字符串并判断元素是否为空格。是则替换为"%20",否则不替换
59+
*/
60+
public static String replaceSpace(StringBuffer str) {
61+
62+
int length = str.length();
63+
// System.out.println("length=" + length);
64+
StringBuffer result = new StringBuffer();
65+
for (int i = 0; i < length; i++) {
66+
char b = str.charAt(i);
67+
if (String.valueOf(b).equals(" ")) {
68+
result.append("%20");
69+
} else {
70+
result.append(b);
71+
}
72+
}
73+
return result.toString();
74+
75+
}
76+
77+
/**
78+
* 第二种方法:利用API替换掉所用空格,一行代码解决问题
79+
*/
80+
public static String replaceSpace2(StringBuffer str) {
81+
82+
return str.toString().replaceAll("\\s", "%20");
83+
}
6784
}
6885

6986
```
@@ -93,36 +110,36 @@ public class Solution {
93110
```java
94111
//https://leetcode-cn.com/problems/longest-common-prefix/description/
95112
public class Main {
96-
public static String replaceSpace(String[] strs) {
97-
98-
// 数组长度
99-
int len = strs.length;
100-
// 用于保存结果
101-
StringBuffer res = new StringBuffer();
102-
// 注意:=是赋值,==是判断
103-
if (strs == null || strs.length == 0) {
104-
return "";
105-
}
106-
// 给字符串数组的元素按照升序排序(包含数字的话,数字会排在前面)
107-
Arrays.sort(strs);
108-
int m = strs[0].length();
109-
int n = strs[len - 1].length();
110-
int num = Math.min(m, n);
111-
for (int i = 0; i < num; i++) {
112-
if (strs[0].charAt(i) == strs[len - 1].charAt(i)) {
113-
res.append(strs[0].charAt(i));
114-
} else
115-
break;
116-
117-
}
118-
return res.toString();
119-
120-
}
113+
public static String replaceSpace(String[] strs) {
114+
115+
// 数组长度
116+
int len = strs.length;
117+
// 用于保存结果
118+
StringBuffer res = new StringBuffer();
119+
// 注意:=是赋值,==是判断
120+
if (strs == null || strs.length == 0) {
121+
return "";
122+
}
123+
// 给字符串数组的元素按照升序排序(包含数字的话,数字会排在前面)
124+
Arrays.sort(strs);
125+
int m = strs[0].length();
126+
int n = strs[len - 1].length();
127+
int num = Math.min(m, n);
128+
for (int i = 0; i < num; i++) {
129+
if (strs[0].charAt(i) == strs[len - 1].charAt(i)) {
130+
res.append(strs[0].charAt(i));
131+
} else
132+
break;
133+
134+
}
135+
return res.toString();
136+
137+
}
121138
//测试
122-
public static void main(String[] args) {
123-
String[] strs = { "customer", "car", "cat" };
124-
System.out.println(Main.replaceSpace(strs));//c
125-
}
139+
public static void main(String[] args) {
140+
String[] strs = { "customer", "car", "cat" };
141+
System.out.println(Main.replaceSpace(strs));//c
142+
}
126143
}
127144

128145
```
@@ -161,23 +178,23 @@ public class Main {
161178
```java
162179
//https://leetcode-cn.com/problems/longest-palindrome/description/
163180
class Solution {
164-
public int longestPalindrome(String s) {
165-
if (s.length() == 0)
166-
return 0;
167-
// 用于存放字符
168-
HashSet<Character> hashset = new HashSet<Character>();
169-
char[] chars = s.toCharArray();
170-
int count = 0;
171-
for (int i = 0; i < chars.length; i++) {
172-
if (!hashset.contains(chars[i])) {// 如果hashset没有该字符就保存进去
173-
hashset.add(chars[i]);
174-
} else {// 如果有,就让count++(说明找到了一个成对的字符),然后把该字符移除
175-
hashset.remove(chars[i]);
176-
count++;
177-
}
178-
}
179-
return hashset.isEmpty() ? count * 2 : count * 2 + 1;
180-
}
181+
public int longestPalindrome(String s) {
182+
if (s.length() == 0)
183+
return 0;
184+
// 用于存放字符
185+
HashSet<Character> hashset = new HashSet<Character>();
186+
char[] chars = s.toCharArray();
187+
int count = 0;
188+
for (int i = 0; i < chars.length; i++) {
189+
if (!hashset.contains(chars[i])) {// 如果hashset没有该字符就保存进去
190+
hashset.add(chars[i]);
191+
} else {// 如果有,就让count++(说明找到了一个成对的字符),然后把该字符移除
192+
hashset.remove(chars[i]);
193+
count++;
194+
}
195+
}
196+
return hashset.isEmpty() ? count * 2 : count * 2 + 1;
197+
}
181198
}
182199
```
183200

@@ -203,26 +220,26 @@ class Solution {
203220
```java
204221
//https://leetcode-cn.com/problems/valid-palindrome/description/
205222
class Solution {
206-
public boolean isPalindrome(String s) {
207-
if (s.length() == 0)
208-
return true;
209-
int l = 0, r = s.length() - 1;
210-
while (l < r) {
211-
// 从头和尾开始向中间遍历
212-
if (!Character.isLetterOrDigit(s.charAt(l))) {// 字符不是字母和数字的情况
213-
l++;
214-
} else if (!Character.isLetterOrDigit(s.charAt(r))) {// 字符不是字母和数字的情况
215-
r--;
216-
} else {
217-
// 判断二者是否相等
218-
if (Character.toLowerCase(s.charAt(l)) != Character.toLowerCase(s.charAt(r)))
219-
return false;
220-
l++;
221-
r--;
222-
}
223-
}
224-
return true;
225-
}
223+
public boolean isPalindrome(String s) {
224+
if (s.length() == 0)
225+
return true;
226+
int l = 0, r = s.length() - 1;
227+
while (l < r) {
228+
// 从头和尾开始向中间遍历
229+
if (!Character.isLetterOrDigit(s.charAt(l))) {// 字符不是字母和数字的情况
230+
l++;
231+
} else if (!Character.isLetterOrDigit(s.charAt(r))) {// 字符不是字母和数字的情况
232+
r--;
233+
} else {
234+
// 判断二者是否相等
235+
if (Character.toLowerCase(s.charAt(l)) != Character.toLowerCase(s.charAt(r)))
236+
return false;
237+
l++;
238+
r--;
239+
}
240+
}
241+
return true;
242+
}
226243
}
227244
```
228245

@@ -254,28 +271,28 @@ class Solution {
254271
```java
255272
//https://leetcode-cn.com/problems/longest-palindromic-substring/description/
256273
class Solution {
257-
private int index, len;
258-
259-
public String longestPalindrome(String s) {
260-
if (s.length() < 2)
261-
return s;
262-
for (int i = 0; i < s.length() - 1; i++) {
263-
PalindromeHelper(s, i, i);
264-
PalindromeHelper(s, i, i + 1);
265-
}
266-
return s.substring(index, index + len);
267-
}
268-
269-
public void PalindromeHelper(String s, int l, int r) {
270-
while (l >= 0 && r < s.length() && s.charAt(l) == s.charAt(r)) {
271-
l--;
272-
r++;
273-
}
274-
if (len < r - l - 1) {
275-
index = l + 1;
276-
len = r - l - 1;
277-
}
278-
}
274+
private int index, len;
275+
276+
public String longestPalindrome(String s) {
277+
if (s.length() < 2)
278+
return s;
279+
for (int i = 0; i < s.length() - 1; i++) {
280+
PalindromeHelper(s, i, i);
281+
PalindromeHelper(s, i, i + 1);
282+
}
283+
return s.substring(index, index + len);
284+
}
285+
286+
public void PalindromeHelper(String s, int l, int r) {
287+
while (l >= 0 && r < s.length() && s.charAt(l) == s.charAt(r)) {
288+
l--;
289+
r++;
290+
}
291+
if (len < r - l - 1) {
292+
index = l + 1;
293+
len = r - l - 1;
294+
}
295+
}
279296
}
280297
```
281298

@@ -381,20 +398,20 @@ import java.util.Scanner;
381398
* @Description: TODO 求给定合法括号序列的深度
382399
*/
383400
public class Main {
384-
public static void main(String[] args) {
385-
Scanner sc = new Scanner(System.in);
386-
String s = sc.nextLine();
387-
int cnt = 0, max = 0, i;
388-
for (i = 0; i < s.length(); ++i) {
389-
if (s.charAt(i) == '(')
390-
cnt++;
391-
else
392-
cnt--;
393-
max = Math.max(max, cnt);
394-
}
395-
sc.close();
396-
System.out.println(max);
397-
}
401+
public static void main(String[] args) {
402+
Scanner sc = new Scanner(System.in);
403+
String s = sc.nextLine();
404+
int cnt = 0, max = 0, i;
405+
for (i = 0; i < s.length(); ++i) {
406+
if (s.charAt(i) == '(')
407+
cnt++;
408+
else
409+
cnt--;
410+
max = Math.max(max, cnt);
411+
}
412+
sc.close();
413+
System.out.println(max);
414+
}
398415
}
399416

400417
```
@@ -407,39 +424,39 @@ public class Main {
407424
//https://www.weiweiblog.cn/strtoint/
408425
public class Main {
409426

410-
public static int StrToInt(String str) {
411-
if (str.length() == 0)
412-
return 0;
413-
char[] chars = str.toCharArray();
414-
// 判断是否存在符号位
415-
int flag = 0;
416-
if (chars[0] == '+')
417-
flag = 1;
418-
else if (chars[0] == '-')
419-
flag = 2;
420-
int start = flag > 0 ? 1 : 0;
421-
int res = 0;// 保存结果
422-
for (int i = start; i < chars.length; i++) {
423-
if (Character.isDigit(chars[i])) {// 调用Character.isDigit(char)方法判断是否是数字,是返回True,否则False
424-
int temp = chars[i] - '0';
425-
res = res * 10 + temp;
426-
} else {
427-
return 0;
428-
}
429-
}
430-
return flag == 1 ? res : -res;
431-
432-
}
433-
434-
public static void main(String[] args) {
435-
// TODO Auto-generated method stub
436-
String s = "-12312312";
437-
System.out.println("使用库函数转换:" + Integer.valueOf(s));
438-
int res = Main.StrToInt(s);
439-
System.out.println("使用自己写的方法转换:" + res);
440-
441-
}
427+
public static int StrToInt(String str) {
428+
if (str.length() == 0)
429+
return 0;
430+
char[] chars = str.toCharArray();
431+
// 判断是否存在符号位
432+
int flag = 0;
433+
if (chars[0] == '+')
434+
flag = 1;
435+
else if (chars[0] == '-')
436+
flag = 2;
437+
int start = flag > 0 ? 1 : 0;
438+
int res = 0;// 保存结果
439+
for (int i = start; i < chars.length; i++) {
440+
if (Character.isDigit(chars[i])) {// 调用Character.isDigit(char)方法判断是否是数字,是返回True,否则False
441+
int temp = chars[i] - '0';
442+
res = res * 10 + temp;
443+
} else {
444+
return 0;
445+
}
446+
}
447+
return flag == 1 ? res : -res;
448+
449+
}
450+
451+
public static void main(String[] args) {
452+
// TODO Auto-generated method stub
453+
String s = "-12312312";
454+
System.out.println("使用库函数转换:" + Integer.valueOf(s));
455+
int res = Main.StrToInt(s);
456+
System.out.println("使用自己写的方法转换:" + res);
457+
458+
}
442459

443460
}
444461

445-
```
462+
```

0 commit comments

Comments
 (0)