<p>如果您正在努力解决这个问题背后的概念和逻辑,我建议您退一步,看看更简单的编码教程和交互式练习。您可能还喜欢尝试JavaScript,从一开始就可以更容易地获得创造性,构建出可以在浏览器中立即与之交互的片段和/或网页。然后,当你在你的腰带下获得更多有趣的编码词汇时,它的算法部分就会显得更加熟悉和自然。我也认为让你自己的创造力和想象力引导你可以是一个非常强大的学习过程。在</p>
<p>让我们暂时忘掉字母顺序的部分。想象一下,我们有一袋信,我们一次抽出一个字母而不知道下一个字母是哪一个字母,我们必须连续记录<code>R</code>的最长运行。你会怎么做?让我们试着用文字来描述这个过程,然后是伪代码。在</p>
<p>我们将保留一个容器,以保存到目前为止我们所看到的最长的运行,另一个用于检查当前运行。我们提取字母,直到连续碰到两个<code>R</code>,然后将其放入“当前”容器中。下一个字母不是<code>R</code>,这意味着我们的运行结束了。“迄今为止最长的”运行是空的,因此我们将“当前”容器倒入其中并继续。接下来的四个字母不是<code>R</code>s,所以我们忽略它们。然后我们得到一个<code>R</code>,我们把它放进“current”,然后是一个<code>H</code>。我们的跑步又结束了,但这一次我们在“当前”中的<code>R</code>比我们在“迄今为止最长的”中已有的两个还少,所以我们保持这些和空的“当前”</p>
<p>我们得到一个<code>A</code>,一个<code>B</code>,和一个<code>C</code>,然后运行五个<code>R</code>,我们将它们逐个放入“当前”容器中。我们的包现在包含最后一个字母,a <code>T</code>。我们看到我们的运行又结束了,而且“当前”容器的容器比“迄今为止最长的”容器多,所以我们倒出“最长”并用“当前”中的五个<code>R</code>替换其内容。就这样,我们在包中找到了<code>R</code>的最长行程。(如果我们有更多的运行,每次运行结束时,我们会选择是否替换“迄今为止最长”的内容。)</p>
<p>在伪代码中:</p>
<pre><code>// Initialise
current <- nothing
longest <- nothing
for letter in bag:
if letter == 'R':
add 'R' to current
else:
if there are more letters
in current than longest:
empty longest and pour
in letters from current
otherwise:
empty current to get ready
for the next possible run
</code></pre>
<p>现在字母顺序的规定只是稍微使我们的情况复杂化了。我们将需要跟踪“current”中最近的一封信,为了继续运行,它没有看到另一个相同的字母。相反,下一个字母必须比我们放在current中的最后一个字母“更大”(按字典顺序);否则,运行结束,我们根据“迄今为止最长的”进行数量检查</p>