方法1: construct the rotated string,然后比较是否相等。这边利用到一个hashmap来存储每个数字和其反转之后对应的数字。时间复杂n,空间复杂n(因为stringbuilder需要O(n) space)。
class Solution {
public boolean isStrobogrammatic(String num) {
Map<Character,Character> map = new HashMap<>();
map.put('0','0');
map.put('1','1');
map.put('6','9');
map.put('8','8');
map.put('9','6');
StringBuilder sb = new StringBuilder();
for(int i = 0; i < num.length(); i++){
char c = num.charAt(i);
if(!map.keySet().contains(c)) return false;
char ch = map.get(c);
sb.append(ch);
}
String rotate = sb.reverse().toString();
return rotate.equals(num) ? true : false;
}
}
方法2: two pointer。不需要stringbuilder,所以空间复杂度优化了,变为1。思路很简单,两个指针一个指向头,一个指向尾,从两端向中间推进。每次loop比较两个指针对应的数字,看是否满足题目条件。
class Solution {
public boolean isStrobogrammatic(String num) {
int left = 0;
int right = num.length() - 1;
while(left <= right){
char head = num.charAt(left);
char tail = num.charAt(right);
if(head != tail){
if(!(head == '6' && tail == '9') && !(head == '9' && tail == '6')) return false;
}else{
if(head != '0' && head != '1' && head != '8') return false;
}
left++;
right--;
}
return true;
}
}
总结:
- 我发现了不管是什么类型的题目,只要涉及到string,几乎都要考虑two pointer放啊。