<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>String on Kelly Dev</title><link>https://kelly-chui.github.io/algorithmtags/string/</link><description>Recent content in String on Kelly Dev</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Fri, 14 Aug 2026 12:17:14 +0900</lastBuildDate><atom:link href="https://kelly-chui.github.io/algorithmtags/string/index.xml" rel="self" type="application/rss+xml"/><item><title>Codeforces 550A. Two Substrings</title><link>https://kelly-chui.github.io/ps/2026/ps-codeforces-550a-two-substrings/</link><pubDate>Fri, 14 Aug 2026 12:17:14 +0900</pubDate><guid>https://kelly-chui.github.io/ps/2026/ps-codeforces-550a-two-substrings/</guid><description>&lt;h2 id="문제"&gt;문제&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://codeforces.com/problemset/problem/550/A"&gt;https://codeforces.com/problemset/problem/550/A&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="풀이"&gt;풀이&lt;/h2&gt;
&lt;p&gt;스트링 &lt;code&gt;s&lt;/code&gt;가 주어지고, 이 &lt;code&gt;s&lt;/code&gt; 안에서 서브스트링 &lt;code&gt;&amp;quot;AB&amp;quot;&lt;/code&gt;와 &lt;code&gt;&amp;quot;BA&amp;quot;&lt;/code&gt;가 겹쳐지지 않은 상태로 존재하면 &lt;code&gt;&amp;quot;YES&amp;quot;&lt;/code&gt; 아니라면 &lt;code&gt;&amp;quot;NO&amp;quot;&lt;/code&gt; 출력하면 된다.&lt;/p&gt;
&lt;p&gt;문제에서 주어진 예시인 &lt;code&gt;&amp;quot;ABA&amp;quot;&lt;/code&gt; 같은 경우는 &lt;code&gt;&amp;quot;NO&amp;quot;&lt;/code&gt;가 된다. &lt;code&gt;&amp;quot;AB&amp;quot;&lt;/code&gt;와 &lt;code&gt;&amp;quot;BA&amp;quot;&lt;/code&gt;가 서로 따로 존재하지 않기 때문이다. 하지만 &lt;code&gt;&amp;quot;ABCABA&amp;quot;&lt;/code&gt; 같은 경우에는 &lt;code&gt;&amp;quot;AB&amp;quot;&lt;/code&gt;와 &lt;code&gt;&amp;quot;BA&amp;quot;&lt;/code&gt;가 &lt;code&gt;&amp;quot;BA&amp;quot;&lt;/code&gt;는 겹쳐져 있지만 이미 앞에서 &lt;code&gt;&amp;quot;AB&amp;quot;&lt;/code&gt;가 존재하기 때문에, &lt;code&gt;&amp;quot;YES&amp;quot;&lt;/code&gt;가 된다.&lt;/p&gt;
&lt;p&gt;이런 예외들을 알아내면, 문제를 푸는 방식은 단순하다. &lt;code&gt;&amp;quot;AB&amp;quot;&lt;/code&gt;를 찾은 후, 그 이후(&lt;code&gt;&amp;quot;B&amp;quot;&lt;/code&gt; 이후)에 있는 인덱스부터 &lt;code&gt;&amp;quot;BA&amp;quot;&lt;/code&gt;를 찾고, 만약 존재한다면 &lt;code&gt;&amp;quot;YES&amp;quot;&lt;/code&gt;, 존재하지 않는다면 다시 &lt;code&gt;&amp;quot;BA&amp;quot;&lt;/code&gt;를 먼저 찾은 후, &lt;code&gt;&amp;quot;A&amp;quot;&lt;/code&gt;의 인덱스 이후에 있는 인덱스부터 &lt;code&gt;&amp;quot;AB&amp;quot;&lt;/code&gt;를 찾으면 된다. 둘 다 불가능하다면 &lt;code&gt;&amp;quot;NO&amp;quot;&lt;/code&gt;가 된다.&lt;/p&gt;</description></item><item><title>Leetcode 3090. Maximum Length Substring With Two Occurrences</title><link>https://kelly-chui.github.io/ps/2026/ps-leetcode-3090-maximum-length-substring-with-two-occurrences/</link><pubDate>Fri, 14 Aug 2026 11:53:07 +0900</pubDate><guid>https://kelly-chui.github.io/ps/2026/ps-leetcode-3090-maximum-length-substring-with-two-occurrences/</guid><description>&lt;h2 id="문제"&gt;문제&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://leetcode.com/problems/maximum-length-substring-with-two-occurrences"&gt;https://leetcode.com/problems/maximum-length-substring-with-two-occurrences&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="풀이"&gt;풀이&lt;/h2&gt;
&lt;p&gt;스트링 &lt;code&gt;s&lt;/code&gt;가 주어지고, 스트링 &lt;code&gt;s&lt;/code&gt;의 서브스트링 중에서 같은 문자가 최대 2번 까지만 등장하는 서브스트링의 최대 길이를 리턴하는 문제이다.&lt;/p&gt;
&lt;p&gt;투 포인터를 이용해서, 서브스트링 내부의 각 문자의 개수는 &lt;code&gt;frequencies&lt;/code&gt; 딕셔너리로 추적하고, 같은 문자가 2개를 초과하면 &lt;code&gt;start&lt;/code&gt;, 그렇지 않다면 &lt;code&gt;end&lt;/code&gt;를 증가시키는 방향으로 &lt;code&gt;s&lt;/code&gt;를 탐색하면 된다.&lt;/p&gt;
&lt;p&gt;문제의 제약조건이 널널해서 $O(n^2)$ 방식의 브루트 포스로도 풀 수 있지만 투 포인터를 이용하면 $O(n)$으로 쉽게 풀 수 있다.&lt;/p&gt;
&lt;h2 id="코드"&gt;코드&lt;/h2&gt;
&lt;div class="code-theme-github"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Solution&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;maximumLengthSubstring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;frequencies&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;frequencies&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;frequencies&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;frequencies&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;frequencies&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;answer&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</description></item></channel></rss>