前言
字符串处理的题目往往涉及复杂的流程以及条件情况,如果直接上手写程序,一不小心就会写出极其臃肿的代码。 因此,为了有条理地分析每个输入字符的处理方法,我们可以使用自动机这个概念。
一、案例
二、题解
package com.xhu.offer.leetcode;
import java.util.HashMap;
import java.util.Map;
public class StrToInt {
public int strToInt(String str) {
Automation am = new Automation();
for (char c : str.toCharArray()) am.get(c);
return (int) am.ans * am.sign;
}
}
class Automation {
public long ans = 0;
public int sign = 1;
public int state = 0;
public Map<Integer, int[]> ac = new HashMap<>();
{
ac.put(0, new int[]{0, 1, 2, 3});
ac.put(1, new int[]{3, 3, 2, 3});
ac.put(2, new int[]{3, 3, 2, 3});
ac.put(3, new int[]{3, 3, 3, 3});
}
public void get(char ch) {
state = ac.get(state)[getIndex(ch)];
if (1 == state && '-' == ch) sign = -1;
else if (2 == state) {
ans = ans * 10 + ch - '0';
ans = 1 == sign ? Math.min(ans, Integer.MAX_VALUE) : Math.min(ans, -1 * (long) Integer.MIN_VALUE);
}
}
private int getIndex(char ch) {
if (Character.isSpaceChar(ch)) return 0;
if ('+' == ch || '-' == ch) return 1;
if (Character.isDigit(ch)) return 2;
return 3;
}
}
总结
1)自动机能够避免复杂的判断。
参考文献
[1] LeetCode 简单自动机
|