LoginSignup
3

More than 5 years have passed since last update.

よくある力技O(n^3)らしい回文検出 / すべての部分文字列の検出

Posted at

スクラッチパッドでささっと

var text = document.documentElement.textContent
text = text.replace(/\s|\n/g, '')
//console.log(text)

var kaibun = '' // ローマ字!
for (var i = 0; i < text.length; i++) {
  var before = i - 1
  var after  = i + 1
  if (before == -1 || after == text.length) {
    continue;
  }

  // 真ん中が同じ2文字なタイプの回文の場合は?3文字は1文字の場合で検出できそうだから、1になっても3になってもいいのか?
  if(text[i] == text[before]) {
    --before
  }
  if(text[i] == text[after]) {
    ++before
  }

  while(text[before] == text[after]) {
    kaibun = text.substring(before, after + 1)
    //console.log('回文',kaibun) // 回文の部分回文なので最長になるまでは回文としない
    --before
    ++after
    if (before == -1 || after == text.length) {
      break;
    }
  }

  // 面白いものがほしいので日本語&長さ制限をつける
  if (kaibun != '' && kaibun.length >= 5 && kaibun.match(/[\u30a0-\u30ff\u3040-\u309f\u3005-\u3006\u30e0-\u9fcf]/) /* 日本語を含んでいる */) {
    console.log(kaibun)
    kaibun = ''
  }
}

推敲・検証なし。

作ってから他のコードをちらちら見ると、もっと変数数も少なくて判定もスマートで凹む。

日本語遊びは結局漢字をひらく(やカナもひらがな化)部分がネックになって、回文や575検出などは詰まってしまいます。
英文だけでは面白くないですしね…。


回文 - Wikipedia
で実行すると

ともついにいつもと
五・七・五
わかみかものとかなかとのもかみかわ
んどこどん
いた(たい
たいもくよとんとことんとよくもいた
かな(なか
かしみしか
なかしみしかししかしみしかな
かしみしか
みなくさのなははくとしれくすりなりすくれしとくははなのさくなみ
たのむそのいかにもにかいのそむのた
さかのなはやとりたりとやはなのかさ
の世しばしよしばし世の
よしはしよ
はかなのよしはしよしはしよのなかは
よしはしよ
にわのわに
まさかさかさま
たび浴びた
アニマルマニア
サ・カ・サ
せとちとせ
しぶいぶし
こたつたこ
スキトキメキトキス
12月21
アニマルマニア
んだ(だん
だんしがしんだ

参考

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3