2017年10月18日水曜日

文字列が回文かどうかを判定する

問題:与えられた文字列が回文かどうかを調べる関数を作成せよ


回文とは

上から読んでも下から読んでも同じである文字列のことをいいます。
例えば

abcba,abba

などです。

回文と判定するには

回文の文字列を見るとなんとなく想像できるかと思いますが、
奇数個の文字列が2個以上存在すると回文ではなくなってしまいます。
文字数に着目して、この条件が正しいかどうかチェックしましょう

奇数個の文字列

abcba abcdabd

これらの文字列は回文です。
法則に着目すると、奇数の数の文字が一つしかないことに気づきます。
では今度は偶数個の文字列です。

abcbca,abcdcbda

偶数個の回文には、偶数個の文字しか置けないことに気が付きます
よって奇数個の文字が2つ以上あるとき回文でないことが判定できます。

これらを踏んでのkotlinのサンプルコードです

kotlin
fun main(args : Array) {
    if(isPalindrome("eeffkabcabcdd")){
        println("回文です")
    }
    else{
        println("回文ではありません")
    }
}

// 回文かどうかチェックする
fun isPalindrome(str : String) : Boolean{
    var tables = getCharFrequencyTable("ababc")
    return !isOddNumOne(tables)
}

/**
 * 文字に対応する数値を返す
 * アルファベット以外なら-1を返す
 */
fun getCharNumber(c : Char) : Int{
    val a = Character.getNumericValue('a')
    val z = Character.getNumericValue('z')
    val charInt = Character.getNumericValue(c)
    // アルファベット範囲内
    if(charInt >= a && charInt <= z){
        return charInt - a
    }
    return -1
}

// 各文字が何個含まれるのかを保持する配列を返す
fun getCharFrequencyTable(str : String) : IntArray{
    var tables = IntArray(Character.getNumericValue('z') - Character.getNumericValue('a') + 1)
    for(c in str) {
        val charInt = getCharNumber(c)
        if(charInt != -1){
            tables[charInt]++
        }
    }
    return tables
}

// 奇数の文字数が複数ないか
fun isOddNumOne(tables : IntArray) : Boolean{
    var isOdd : Boolean = false
    for(num in tables){
        if(num % 2 != 0){
            if(isOdd){
                return false;
            }
            isOdd = true
        }
    }
    return false
}

0 件のコメント:

コメントを投稿