キューとは
キューは、FIFO(First In First Out)と呼ばれるデータ構造になります。スタックは、後から挿入されたものから取り出されていましたが、
キューは最初に挿入したものが、最初に取り出されます。
イメージでいうと、レジの会計でしょうか。
例を見ていきましょう
数字を1,3,5の順でキューに挿入します。
1
3 1
5 3 1
次にこれらを取り出します。
最初に挿入した1から取り出されます。
5 3
5
以上です。
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 }
fun isPermutation(str1 : String,str2 : String) : Boolean { // 長さが違えば異なる文字列 if(str1.length != str2.length){ return false } // ascii仮定 var letters = IntArray(128) for(char in str1){ // 対応する文字コード数のindexを加算する letters[char.toInt()]++ } // 一致チェック for(char in str2){ letters[char.toInt()]-- // ある文字数が多い場合一致しないことになる if(letters[char.toInt()] < 0){ return false } } return true }
文字コードをasciiと解釈しています
ASCIIコードは128種類らしいので、文字列の長さが128を超えたとすると、重複していることになります。
128個と要素数が決まっているので、boolean型で配列を確保して判定するのが
すぐ思いつくやり方だろうか
fun isUniqueChars(str: String): Boolean { if (str.length > 128) return false var charSet = BooleanArray(128); for (char in str) { var value: Int = char.toInt(); if (charSet[value]) { return false } charSet[value] = true return true } return true }