タグ付けされた質問 「strings」

「文字列」は、通常人間が読めるテキストの単位を表す一連の文字です。このトピックに関する質問は、プログラムでの文字列の処理、およびさまざまな言語と環境が文字列を定義および操作する方法を扱います。

2
ユーザーテキスト入力に基づいてリストから最も可能性の高いオプションを選択する方法
ユーザーのテキスト入力に基づいてオプションを選択する必要があるOCRアプリケーションで作業しています。 Ex: Available Options: ["python", "ruby", "java", "clojure", "haskell"] Input: kava Output: java Input: ruby Output: ruby Input: clujuro Output: clojure etc.. 私のアプリケーションはPythonベースですが、この問題を解決するためのアルゴリズムがすでに存在しますか?

4
私たちはどれほど守勢すべきですか?
私たちはいくつかのコードでPexを実行しており、いくつかの良い点を示してきました(悪い点はありますが、本番環境に到達する前にそれらを示しています!)。 ただし、Pexの優れた点の1つは、問題の検出を必ずしも停止する必要がないことです。 見つかった1つの領域は、文字列を渡すときに空の文字列をチェックしていなかったことです。 そこで変更しました: if (inputString == null) に if (string.IsNullOrEmpty(inputString)) // *** それは最初の問題を修正しました。しかし、その後、Pexを再度実行すると、次のことが決定されました。 inputString = "\0"; 問題を引き起こしていました。その後 inputString = "\u0001"; 私たちが決定したのは、遭遇// ***した場合にデフォルトを使用でき、他の奇妙な入力によって引き起こされた例外を見て喜んでいるということです(そしてそれを処理します)。 それで十分ですか?

5
文字列を返す関数、良いスタイル?
私のCプログラムでは、ADTの文字列表現を作成する方法が必要になることがよくあります。文字列を画面に出力する必要がない場合でも、このようなデバッグ方法があると便利です。そのため、この種の機能がよく出てきます。 char * mytype_to_string( const mytype_t *t ); 文字列が返すメモリを処理するために、ここには(少なくとも)3つのオプションがあることを実感しています。 代替方法1:関数の静的文字配列に戻り文字列を格納します。文字列がすべての呼び出しで上書きされることを除いて、私はあまり考える必要はありません。これは、場合によっては問題になることがあります。 代替方法2:関数内のmallocを使用して、ヒープに文字列を割り当てます。バッファのサイズや上書きについて考える必要がないので、本当にすてきです。ただし、完了したら文字列をfree()することを忘れないでください。また、解放できるように一時変数に割り当てる必要もあります。ヒープ割り当てはスタック割り当てよりもはるかに遅いため、これがループで繰り返されるとボトルネックになります。 代替方法3:ポインタをバッファに渡し、呼び出し側にそのバッファを割り当てさせます。お気に入り: char * mytype_to_string( const mytype_t *mt, char *buf, size_t buflen ); これにより、発信者により多くの労力がかかります。この代替案では、引数の順序に関する別のオプションが提供されることにも気づきました。最初と最後のどちらの引数が必要ですか?(実際には6つの可能性) それで、どちらを選ぶべきですか?なんで?Cの開発者の間には、ある種の未記述の標準がありますか?

5
文字列内にテキストマーカーを配置するのは悪いスタイルですか?代わりはありますか?
私は多くの操作を必要とする巨大な文字列を扱います。 たとえば、次のような文字列を生成します。 パート1 ボート セクションA プログラミング パート2 プログラミング用の分割ボート。 セクションAA セクションSQLエントリ。 文字列が大きすぎて手動ですべての部分をチェックすることはできません。今、私はする必要がありsplit、このstring中stringlistのセクションおよび部品によって。2つのオプションを考えることができます。 正規表現: QStringList sl = s.split(QRegularExpression("\n(?=Part [0-9]+|Section [A-Z]+)")); それはうまくいくように見えますが、時々例外が通り抜けます(IE:Section SQL Entries誤って分割されます) それ以外の場合は、最初の文字列を生成するときにマーカーを配置できます。 🚤💻パート1 ボート 🚤💻セクションA プログラミング 🚤💻パート2 プログラミング用のパーティショニングボート。 🚤💻 セクションAA セクションSQLエントリ。 つまり、文字列の分割が簡単になります。 QStringList sl = s.split("🚤💻")); これらのどちらも良いスタイルやプログラミングの実践ではないことはわかりますが、この時点まで、それについては議論しておらず、代替案も見つけていません。 あなたが私のプロジェクトマネージャーである場合、これらの方法のいずれかを受け入れますか? そうでない場合、私がベストプラクティスとして何をすればよいと思いますか?

5
C ++での冗長文字列割り当ての最適化
パフォーマンスが問題となっているかなり複雑なC ++コンポーネントがあります。プロファイリングは、実行時間のほとんどがstd::stringsのメモリの割り当てに費やされていることを示しています。 これらの文字列には多くの冗長性があることを知っています。一握りの値は非常に頻繁に繰り返されますが、固有の値もたくさんあります。文字列は通常かなり短いです。 私は今、それらの頻繁な割り当てを何らかの形で再利用することが理にかなっているのかどうか考えています。1000の異なる「foobar」値への1000のポインターの代わりに、1つの「foobar」値への1000のポインターを持つことができます。これによりメモリ効率が向上するという事実は素晴らしいボーナスですが、ここでは主に待機時間について心配しています。 すでに割り当てられた値のある種のレジストリを維持することは1つのオプションだと思いますが、レジストリの検索を冗長なメモリ割り当てよりも高速にすることは可能ですか?これは実行可能なアプローチですか?

1
2つの文字列に一致しますが、ある程度のエラーを許容します
どうすれば2つの文字列を一致させることができますが、同時にX文字の文字が一致しない場合があります。エラー数は制御可能な変数である必要があります。 X個の文字が文字列内で一致することはできませんが、シーケンス内で実行される文字数には制限があります。2つの文字列が与えられた場合、5文字が異なることを許可する可能性がありますが、連続して2文字を超えることはできません。 私はこれらの2つの文字列を比較するための推奨アルゴリズムを探しています。または、これに対する既知の解決策がすでにあるかもしれません。

3
文字列の数、各文字が偶数回出現する必要がある場合
私はしばらくの間、この問題に頭蓋骨をぶつけてきましたが、それは本当に私を苛立たせ始めています。問題は: 私は、文字のセットを持ってA、B、C、とD。長さがnあり、各文字が偶数回出現する必要がある場合、これらの文字から文字列を構築する方法をいくつも教えなければなりません。 たとえば、の答えn = 2は4です。 AA BB CC DD の答えn = 4は40です。これらの有効な文字列の一部は次のとおりです。 AAAA AABB CACA DAAD BCCB 私は論理を思いつくのに行き詰まっています。このためのDPソリューションがあると思います。これを介して私の方法を総当たり的にすることは問題外です:ソリューションの数は急速に膨大な数に成長します。 私はあらゆる種類のアイデアを紙に描いてみましたが、役に立ちませんでした。それらのほとんどすべては、それらの複雑さが大きすぎるために破棄しなければなりませんでした。ソリューションは、に対して効率的である必要がありますn = 10^4。 私のアイデアの1つは、実際の文字列を追跡するのではなく、各文字が偶数回または奇数回出現したかどうかを追跡することでした。このロジックを適用する方法を思いつきませんでした。 誰か助けてもらえますか?

1
ダメラウ・レヴェンシュタインの改善の可能性は?
最近、Wikipediaの疑似コードからDamerau-Levenshtein距離アルゴリズムを実装しました。私はそれが動作します正確にどのように任意の説明を見つけることができなかったとの擬似コードは次のように完全に情報価値がない変数名を使用してDA、DB、i1、そしてj1左のように私は私の頭を掻きます。 Pythonでの実装は次のとおりです。https://gist.github.com/badocelot/5327337 Pythonの実装は、プログラムをウォークスルーして何が起こっているのかを理解し、変数の名前をよりわかりやすい名前に変更するのに役立ちました。私は、私が参照枠を持っているレーベンシュタイン距離を計算するためのワーグナーフィッシャーアプローチに十分に精通していました。 過度に長くなるおそれがあるので、ここに私がダメラウ=レヴェンシュタインを理解する方法を示します。 ミステリー変数: DA(last_row私のコードでは)は、各要素が表示された最後の行を保持する一種のマップです。私のコードでは、それは実際のPython辞書です DB(last_match_col)は、現在の行の文字がb一致する最後の列を保持しますa i1(last_matching_row)は、DA現在の文字の行番号ですb j1更新される前のDB/ の値の単なるコピーlast_match_colです。私のコードでlast_match_colは、更新された場所に移動してこの変数を削除しました 転置コスト: H[i1][j1] + (i-i1-1) + 1 + (j-j1-1) で現在の文字スワップのコスト計算されてbの最後の文字とbであることが知られてa追加または削除のどちらかとの間のすべての文字を処理すること、(最後の試合を)。 コストの要素: H[i1][j1] 転置を見つけると以前の作業が無効になるため、基本コストを転置前の計算のポイントに戻します。 (i-i1-1) 現在の行と現在の文字に一致する最後の行の間の距離であり、これは必要な削除の数です (j-j1-1) 現在の列と一致する最後の列の間の距離、つまり追加の数 余分なもの+ 1は、転置自体のコストです この分析が正しくない場合は、どこに問題があるのか​​を知りたいです。言ったように、アルゴリズムがオンラインでどのように機能するかについての詳細な説明は見つかりませんでした。 改良版? しかし、それを理解して、転置された文字間の追加と削除の両方のコストを計算することには欠陥があるように思われたことに感銘を受けました。1つの追加と1つの削除は置換に相当し、これはチェックしていません。 それがすべて正しい場合、解決策は簡単です。転置された文字間の文字のコストは、追加と削除のどちらか高くなるはずです。できるだけ多くを置換に変換し、残っている追加または削除を追加します。 したがって、コストは次のようになります。 H[i1][j1] + max((i-i1-1), (j-j1-1)) + 1 これがこのバージョンの私のコードです:https : //gist.github.com/badocelot/5327427 いくつかの簡単なテストから、これは正しいようです。たとえば、 "abcdef"-> "abcfad"は編集距離を2(転置 "d"と "f"、 "e"を "a"に変更)しますが、元のアルゴリズムは距離を3(最後の3つ)にします。文字は置換、または1つの転置+ 1つの追加+ …


7
変数を含むstring.formatとインライン変数
使用する長所/短所(ある場合)は何ですか string output; int i = 10; output = string.Format("the int is {0}", i); 対 string output; int i = 10; output = "the int is " + i; 私は常に後者の例を使用してきましたが、オンラインチュートリアルの大部分がstring.formatの例を使用しているようです。効率に関して実際の違いはないと思います。私の最初の考えは、変数を挿入するためにコーダーが文字列を分割し続ける必要がないようにすることです。
9 c#  .net  vb.net  strings 

1
書記素に基づく文字列クラス?
コードポイントや文字ではなく、Unicode書記素クラスタの文字列を表す文字列クラスがないのはなぜでしょうか。ほとんどのアプリケーションでは、プログラマーが必要なときに書記素のコンポーネントにアクセスする方が、コードポイントからコンポーネントを整理する必要があるよりも簡単であるように思えます。 (少なくとも理論的には)。内部的に文字列クラスは、UTF-8、UTF-16などの可変長エンコーディングを使用する場合があります。この場合、UTF-32も可変長です。または、それらすべてのサブクラスを実装します(オプションで、実行時に選択肢を構成して、さまざまな言語が最適なエンコーディングを使用できるようにします)。しかし、プログラマーが文字列を検査するときに書記素ユニットを「見る」ことができれば、

3
JavaのStringクラスがより効率的なindexOf()を実装しないのはなぜですか?
スタックオーバーフローに関する以下の質問の後に /programming/5564610/fast-alernative-for-stringindexofstring-str なぜjava(少なくとも6つ)がより効率的な実装を使用しないのかと疑問に思いましたか? コードは次のとおりです。 java.lang.String#indexOf(String str) 1762 static int indexOf(char[] source, int sourceOffset, int sourceCount, 1763 char[] target, int targetOffset, int targetCount, 1764 int fromIndex) { 1765 if (fromIndex >= sourceCount) { 1766 return (targetCount == 0 ? sourceCount : -1); 1767 } 1768 if (fromIndex < 0) { 1769 …

2
Javaの文字列分割関数の複雑さは何ですか?
私の文字列はタイプであり"abacsdsdvvsg"、"a a a a a a a" 使用していますString[] stringArray = s.split("");か、または上記の分割のString[] stringArray = s.split(" "); 複雑さは何O(string length)ですか? PS:コードが指定されている場合、O(...)を計算する方法を知っています。ここでは分割関数のアルゴリズムがわかりません。
8 java  strings  java8 

3
文字列なしの最長サブシーケンス
サブストリングとしてYを含まないストリングXで最長のサブシーケンスを見つける動的プログラミングアルゴリズムはありますか?この問題は、最長の共通サブシーケンスや文字列など、他のDP文字列アルゴリズムと非常に似ているように見えます。オーバーラップするYの発生を処理できる必要があります。 これは2状態のDP問題である可能性があります。状態[s_pos、t_pos]は、ストリングT [t_pos..M]をサブストリングとして持たないs_posで始まるストリングSの最も長いサブシーケンスです。Nは文字列Sの長さ、Mは文字列Tの長さです。ただし、私の遷移は正しくありません。S= aaabcおよびT =の場合は取得されませんaabc。問題はelseステートメントにあります -文字が等しい場合に遷移する方法がわかりません。実際、私はifブランチが間違っていると感じています...誰が間違っているのか知っていますか? S = aaabおよびT =の場合も失敗しますaab。失敗する理由を説明できます。solve(0、0)を呼び出すと仮定します。solve(0、0)はsolve(1、1)を呼び出します。solve(1、1)はsolve(2、2)を呼び出します。s [2]!= t [2]なので、solve(3、0)から検索を再開します。ただし、aabは部分文字列であり、これをチェックしたり、このケースを考慮したりすることはありません... int solve(int s_pos, int t_pos) { if (s_pos >= N || t_pos >= M) return 0; if (t_pos == M - 1 && s[s_pos] == t[t_pos]) return 0; int ret = 0; if (s[s_pos] != t[t_pos]) { …

5
文字列は不変ですが、なぜすべてが定数ではないのですか?
stringタイプは不変です。 .NETのような高級言語でconstキーワードを使用できstringsます。'const'についての私の理解は一定を意味します(同じままで、値を変更することはできません)。 strings常にではありませんかconstant(IMOの用語constantは、値のライフタイムを意味するたびに型を再作成する必要がある場合、同じコンテキストでは適用できません)、それは一定でした)? 高水準言語、特に.NET(私もJavaに興味があります)では、これはオブジェクトの一般的なメモリ管理/追跡によるものですか、それとも別の理由がありますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.