タイトル説明:
ストロボグラマティック数は、180度回転したときに同じように見える数です(逆さまに見た場合)。
低<=数値<=高の範囲に存在するストロボグラマティック数の合計をカウントする関数を記述します。
例1:
入力:低=「50」、高=「100」
出力:3
説明:69、88、および96は3つのストロボグラマティック数値です。
注意:
範囲が大きい場合があるため、小さい数値と大きい数値は文字列として表されます。
時間計算量:O(n)
はLeetcode 0247の考え方に従います。文字列の長さがnの場合、再帰によって長さnのすべての対称数を見つけることができます。この質問では、低の長さから高の長さまで列挙します。各列挙で、長さの下の対称数を再帰的に見つけ、lowより大きい値とhighの値より小さい値を満たします。したがって、この質問では数値のみを返す必要があるため、再帰的な結果はintに設定するだけで済みます。
class Solution {
private static final char[][] PAIRS = new char[][] {
{
'0', '0'}, {
'1', '1'}, {
'6', '9'}, {
'8', '8'}, {
'9', '6'}};
public int strobogrammaticInRange(String low, String high) {
if(low == null || high == null || low.length() > high.length()
|| (low.length() == high.length() && low.compareTo(high) > 0))
return 0;
int count = 0;
for (int len = low.length(); len <= high.length(); len++) {
count += dfs(low, high, new char[len], 0, len - 1);
}
return count;
}
private int dfs(String low, String high, char[] ch, int left, int right) {
if (left > right) {
String s = new String(ch);
if ((ch.length == low.length() && s.compareTo(low) < 0)
|| (ch.length == high.length() && s.compareTo(high) > 0)) {
return 0;
} else {
return 1;
}
}
int count = 0;
for(char[] p : PAIRS){
ch[left] = p[0];
ch[right] = p[1];
if (ch.length != 1 && ch[0] == '0') {
continue;
}
if (left == right && (p[0] == '6' || p[0] == '9')) {
continue;
}
count += dfs(low, high, ch, left + 1, right - 1);
}
return count;
}
}