杰克工作室 发表于 2023-2-28 21:00

从字符串中查找出对称字符最长的字符串【江小白笔试题】[GO && PHP代码]

从字符串中查找出对称字符最长的字符串:规则:对称字符串,如oppo为对称, opo非对称。<br />
<br />
思路:先找出相临一样的字符串,如pp,然后再左右扩散位置,再次对比是否一样,一样的话,再次扩散位置。以此类推,至到左右取出来的字符串不相同。<br />
<br />
注:下面的算法只列出所有的对称字符串,可以根据length取最大值。
<pre>
//&nbsp;以下是GO代码,注意,有限制的。限制条件:相临位置相同字符为两位,最长6位对称(可由参数length=3控制单向移位)
package&nbsp;main
&nbsp;
import&nbsp;(
&nbsp;&nbsp;&nbsp;&nbsp;&quot;fmt&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&quot;strings&quot;
)
&nbsp;
func&nbsp;main()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;text&nbsp;:=&nbsp;&quot;example:geegopollopg&quot;
&nbsp;&nbsp;&nbsp;&nbsp;arr&nbsp;&nbsp;:=&nbsp;make([]string,&nbsp;0)
&nbsp;&nbsp;&nbsp;&nbsp;lentext&nbsp;:=&nbsp;len(text)
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;受限于go正则无法使用正则,只能先取两位挨个测试
&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;k,&nbsp;_&nbsp;:=&nbsp;range&nbsp;text&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;k&nbsp;+&nbsp;1&nbsp;&gt;&nbsp;lentext&nbsp;-&nbsp;1&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m&nbsp;:=&nbsp;string(text)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;:=&nbsp;string(text)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;:=&nbsp;m&nbsp;+&nbsp;n
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;strings.Index(text,&nbsp;str)&nbsp;!=&nbsp;-1&nbsp;&nbsp;&nbsp;&amp;&amp;&nbsp;&nbsp;m&nbsp;==&nbsp;n&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arr&nbsp;=&nbsp;append(arr,&nbsp;str)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;//fmt.Printf(&quot;%+v&quot;,arr)
&nbsp;&nbsp;&nbsp;&nbsp;//fmt.Println(len(arr))
&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;:=&nbsp;make([]mapinterface{},&nbsp;0)
&nbsp;&nbsp;&nbsp;&nbsp;//循环arr
&nbsp;&nbsp;&nbsp;&nbsp;length&nbsp;:=&nbsp;3&nbsp;//移位最大长度为3
&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;k,&nbsp;v&nbsp;:=&nbsp;range&nbsp;arr&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len2&nbsp;:=&nbsp;len(v)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;len2&nbsp;&lt;&nbsp;2&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;idx&nbsp;:=&nbsp;strings.Index(text,&nbsp;v)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i&nbsp;:=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;length;&nbsp;i++&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;im&nbsp;:=&nbsp;idx&nbsp;-&nbsp;i
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;:=&nbsp;idx&nbsp;+&nbsp;len2&nbsp;+&nbsp;i&nbsp;-&nbsp;1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;im&nbsp;&lt;&nbsp;0&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sm&nbsp;:=&nbsp;string(text)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sn&nbsp;:=&nbsp;string(text)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fmt.Printf(&quot;第%d次大,第%d次小循环:idx位置:%d,&nbsp;开始位置:%d,&nbsp;结束位置:%d, 开始字符串:%v,&nbsp;结束字符串:%v&quot;,&nbsp;k,&nbsp;i,&nbsp;idx,&nbsp;im,&nbsp;in,&nbsp;sm,&nbsp;sn)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;sm&nbsp;==&nbsp;sn&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;append(ret,&nbsp;mapinterface{}{&quot;idx&quot;:im,&nbsp;&quot;length&quot;:&nbsp;in-im+1,&nbsp;&quot;end&quot;:in,&nbsp;&quot;begin&quot;:im})
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println()
&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println(ret)
&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;k,&nbsp;v&nbsp;:=&nbsp;range&nbsp;ret&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//fmt.Println(k,&nbsp;v)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret[&quot;ret&quot;]&nbsp;=&nbsp;text.(int):v[&quot;end&quot;].(int)+1]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fmt.Printf(&quot;第%d次数据:%+v&quot;,&nbsp;k,&nbsp;v)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println()
&nbsp;&nbsp;&nbsp;&nbsp;}
}</pre>
<img alt="image.png" src="data/attachment/forum/202302/28/4752fcca96029f62ffaa123d71c2dc11.png" title="16378311871637831187_814.png" /><br />
<br />
<br />
以下为PHP代码:
<pre>
&lt;?php
$test&nbsp;=&nbsp;&#39;example:geegopollopg&#39;;
$patter1&nbsp;=&nbsp;&quot;/(\w)\\1/&quot;;
preg_match_all($patter1,&nbsp;$test,&nbsp;$arr);
print_r($arr);
&nbsp;
if(empty($arr))&nbsp;{
&nbsp;&nbsp;&nbsp;exit(&#39;empty&nbsp;$arr&#39;);
}
&nbsp;
$ret&nbsp;=&nbsp;[];
echo&nbsp;$test.&quot;\n&quot;;
$length&nbsp;=&nbsp;3;&nbsp;&nbsp;//单向对称长度
foreach($arr&nbsp;as&nbsp;$k&nbsp;=&gt;&nbsp;$v)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;$left_length&nbsp;=&nbsp;strlen($v);&nbsp;//当前字符串长度
&nbsp;&nbsp;&nbsp;&nbsp;$idx&nbsp;=&nbsp;stripos($test,&nbsp;$v);&nbsp;//当前第一次匹配到的对称字符串的位置
&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&#39;第&#39;,($k+1),&#39;轮出现:&#39;,&nbsp;$v,&nbsp;&#39;,位置:&#39;,&nbsp;$idx,&nbsp;&quot;\n&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;for($i=1;&nbsp;$i&nbsp;&lt;=&nbsp;$length;&nbsp;$i++)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$a&nbsp;=&nbsp;substr($test,&nbsp;$idx-$i,&nbsp;1);&nbsp;//最左位置的字符串
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$b&nbsp;=&nbsp;substr($test,&nbsp;$idx&nbsp;+&nbsp;$left_length&nbsp;-&nbsp;1&nbsp;+&nbsp;$i,&nbsp;1);&nbsp;//最右位置的字符串
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$m&nbsp;=&nbsp;$idx-$i;&nbsp;//得到最左位置
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$n&nbsp;=&nbsp;$idx&nbsp;+&nbsp;$left_length&nbsp;-&nbsp;1&nbsp;+&nbsp;$i;&nbsp;//得到最右位置
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&#39;$idx=&#39;.$idx.&#39;,&nbsp;$idx-&#39;.$i.&#39;=&#39;.($idx-$i).&#39;[&#39;.$a.&#39;],&nbsp;$idx+&#39;.$i.&#39;=&#39;.($idx+$i).&#39;[&#39;.$b.&#39;]&#39;.&quot;\n&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($a&nbsp;==&nbsp;$b)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//$ret[$k]&nbsp;=&nbsp;substr($test,&nbsp;$idx&nbsp;-&nbsp;$left_length&nbsp;+&nbsp;$i&nbsp;,&nbsp;$left_length&nbsp;&nbsp;+&nbsp;$i&nbsp;);&nbsp;//这一步不能直接出结果,这里只能做记录
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ret[]&nbsp;=&nbsp;[&#39;a_idx&#39;=&gt;$idx-$i,&nbsp;&#39;a&#39;=&gt;$a,&nbsp;&#39;length&#39;=&gt;$n-$m+1,&nbsp;&#39;ret&#39;=&gt;substr($test,&nbsp;$m,&nbsp;$n-$m+1)];//记录最左位置、最左字符串、字符串最长长度
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;\n&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;}
}
print_r($ret);</pre>
<br />
<img alt="image.png" src="data/attachment/forum/202302/28/5e45135ee452570bd4415a0629d086cb.png" title="16378312091637831209_0363.png" />
页: [1]
查看完整版本: 从字符串中查找出对称字符最长的字符串【江小白笔试题】[GO && PHP代码]