2017-06-07 18 views
1

件名をさらに読む正規表現を書いています: "のアルファベット{a、b}は 'a'発生時から 'b'発生時を3で割ることができる場合にのみ文字列を受け取ります。 誰かが私にこれを手伝ってもらえますか?私はこの問題を解決するために私自身の入力を与えるべきであることを知っていますが、私は何の手がかりも持っていません。"( 'a' * N - 'b' * M)%3 = 0"の条件を満たす正規表現を受け入れる文字列

多分、(aaa)をベースにして、次に「aとb」の次の「ペア」を展開する必要があるかもしれませんが、「aaa」aaabbbのように展開する方法はわかりません。 "(aaa)ababab"のようにはなりません。

+0

私はあなただけでは正規表現でこれを行うことができますかわからない... –

+1

それはのように思えますあなたは数を得るために正規表現を使うことができますが、除算/モジュール算術を行うためにはさらなる開発が必要です – sniperd

+0

これは確かに通常の言語です。あなたは簡単に[FSMを実装する]ことができます(https://www.cs.cmu.edu/~tom7/211/fsm/4f.gif)。 2つの他の受諾不可能な状態を有する。彼らは円で配置されています。 「a」遷移は一方向に進み、「b」は反対方向に遷移する。 – Xufox

答えて

3

カウントベースの正規表現の問題は、有限状態オートマトンを使って表現するのが最も簡単で、単一のパターンに減らすことができます。

3つのノードで、各モジュール値に1つ。 aまたはbが処理されたときのモジュラ値の変化を定義します。

単一遷移によってノードを介して各パスを置換することにより、一つのノードを折りたたみます。

  • 0->2->00->0ba
  • 0->2->10->1bb
  • 1->2->01->0aa
  • 1->2->11->1ab

別のノードに対して繰り返します。

  • 0->1(->1)*->00->0(a|bb)(ab)*(b|aa)

最終パターンがある:(ba|(a|bb)(ab)*(b|aa))*

+0

あなたはこのテーマをさらに勉強するためのリンクがありますか? –

+0

@RicardoBranco https://courses.engr.illinois.edu/cs373/sp2009/lectures/lect_08.pdf –

関連する問題