2016-05-25 1 views
0

私は最近、文字列が平衡しているかどうかを確認するようにインタビューの質問をしました。文字列は、次の2つの条件の下で平衡します。文字列内の一致する文字の数をカウントします(正規表現のみ)?

  1. 'a'と 'c'の出現の合計は偶数です。
  2. 'b'と 'd'の出現の合計は偶数です。

したがって、例「cccddbba」の場合、これらの条件は成立します。出現数がc (3) +出現がa (1)even (1+3=4)であり、出現数はd (2) +出現数がです。文字列には 'a'、 'b'、 'c'、および 'd'の文字しか含めることができません。正規表現はこの例だけでなく、どんな文字列でも動作するはずです。

私の仕事は正規表現を書くことだけでした。バックグラウンドでは、正規表現を使って見つかった 'a'と 'c'の一致数を数え、それらを合計します。同じことが 'b'と 'd'になります。

しばらくして正規表現に触れていないので、私は恐ろしく、^([ac])*?[db]*?([ac])*?$までしか得られませんでしたが、それは明らかに間違っています。各アサーションについて

+2

私はインタビューで、「いいえ、正規表現はそれに対して良い解決策ではない」と答えてくれることを尋ねられました。正規表現を使用すると、1が読み取れなくなります。2.将来の拡張のために思いもよらない。 – Tunaki

+0

実際には面接の質問ではなく、実際のインタビューの質問ではありませんでしたので、私はあなたに言ったことに完全に同意します。 – dtgee

答えて

2

使用別々のルック先読み:

^(?=(([^ac]*[ac]){2})*[^ac]*$)(?=(([^bd]*[bd]){2})*[^bd]*$).*$ 

live demoを参照してください。

([^ac]*[ac]){2})[ac]のペアと一致するため、これは基本的に動作します。残りは比較的簡単です。肯定先読みを使用して

+0

これは質問の例と一致していません –

+0

申し訳ありません。 – dtgee

+0

@Andyはい、それはありません。デモへのリンクを参照してください(おそらくあなたはすぐに修正された短命の以前のバージョンを見た)。 – Bohemian

0

、あなたは確認することができるかどうかとのためにも、回数、および同上を発生cはBとD:

^(?=[^ac]*([ac][^ac]*[ac][^ac]*)*$)(?=[^bd]*([bd][^bd]*[bd][^bd]*)*$).*$ 

2つの先読みグループのそれぞれには、文字列全体もが含まれていることを確認してくださいそれぞれの文字の数。先読みの終わり($)は、文字列の最後までスキャンを強制的に行うように固定されています。

関連する問題