找回密码
 立即注册
搜索
查看: 531|回复: 0

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

  [复制链接]
发表于 2023-2-28 21:00 | 显示全部楼层 |阅读模式
从字符串中查找出对称字符最长的字符串:规则:对称字符串,如oppo为对称, opo非对称。

思路:先找出相临一样的字符串,如pp,然后再左右扩散位置,再次对比是否一样,一样的话,再次扩散位置。以此类推,至到左右取出来的字符串不相同。

注:下面的算法只列出所有的对称字符串,可以根据length取最大值。
// 以下是GO代码,注意,有限制的。限制条件:相临位置相同字符为两位,最长6位对称(可由参数length=3控制单向移位)
package main
 
import (
    "fmt"
    "strings"
)
 
func main() {
    text := "example:geegopollopg"
    arr  := make([]string, 0)
    lentext := len(text)
    // 受限于go正则无法使用正则,只能先取两位挨个测试
    for k, _ := range text {
        if k + 1 > lentext - 1 {
            break
        }
        m := string(text[k])
        n := string(text[k+1])
        str := m + n
        if strings.Index(text, str) != -1   &&  m == n {
           arr = append(arr, str)
       }
    }
    //fmt.Printf("%+v",arr)
    //fmt.Println(len(arr))
 
    ret := make([]map[string]interface{}, 0)
    //循环arr
    length := 3 //移位最大长度为3
    for k, v := range arr {
        len2 := len(v)
        if len2 < 2 {
            break
        }
        idx := strings.Index(text, v)
        for i := 1; i <= length; i++ {
            im := idx - i
            in := idx + len2 + i - 1
            if im < 0 {
                break
            }
            sm := string(text[im])
            sn := string(text[in])
            fmt.Printf("第%d次大,第%d次小循环:idx位置:%d, 开始位置:%d, 结束位置:%d, 开始字符串:%v, 结束字符串:%v", k, i, idx, im, in, sm, sn)
            fmt.Println()
            if sm == sn {
                 ret = append(ret, map[string]interface{}{"idx":im, "length": in-im+1, "end":in, "begin":im})
            }
        }
    }
    fmt.Println()
    fmt.Println(ret)
    for k, v := range ret {
        //fmt.Println(k, v)
        ret[k]["ret"] = text[v["begin"].(int):v["end"].(int)+1]
        fmt.Printf("第%d次数据:%+v", k, v)
        fmt.Println()
    }
}
image.png


以下为PHP代码:
<?php
$test = 'example:geegopollopg';
$patter1 = "/(\w)\\1/";
preg_match_all($patter1, $test, $arr);
print_r($arr);
 
if(empty($arr[0])) {
   exit('empty $arr');
}
 
$ret = [];
echo $test."\n";
$length = 3;  //单向对称长度
foreach($arr[0] as $k => $v) {
    $left_length = strlen($v); //当前字符串长度
    $idx = stripos($test, $v); //当前第一次匹配到的对称字符串的位置
    echo '第',($k+1),'轮出现:', $v, ',位置:', $idx, "\n";
    for($i=1; $i <= $length; $i++) {
        $a = substr($test, $idx-$i, 1); //最左位置的字符串
        $b = substr($test, $idx + $left_length - 1 + $i, 1); //最右位置的字符串
        $m = $idx-$i; //得到最左位置
        $n = $idx + $left_length - 1 + $i; //得到最右位置
        echo '$idx='.$idx.', $idx-'.$i.'='.($idx-$i).'['.$a.'], $idx+'.$i.'='.($idx+$i).'['.$b.']'."\n";
        if($a == $b) {
            //$ret[$k] = substr($test, $idx - $left_length + $i , $left_length  + $i ); //这一步不能直接出结果,这里只能做记录
            $ret[] = ['a_idx'=>$idx-$i, 'a'=>$a, 'length'=>$n-$m+1, 'ret'=>substr($test, $m, $n-$m+1)];//记录最左位置、最左字符串、字符串最长长度
        }
        echo "\n";
    }
}
print_r($ret);

image.png

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|学习笔记

GMT+8, 2024-12-21 20:26 , Processed in 0.031174 second(s), 13 queries , APCu On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表