字符串拼接处理
要求:
- ab+ba+aa = aa;
- aabbcc+ccbbaa=aabbbbaa;
这是今天一个朋友问我的一个面试题, 看题目应该是考字符串处理,下午写了一半没写完, 吃完饭脑子还在想着这件事, 现在闲下来也跟着练练手.
思路分析:
- 三个字符串拼接, 前后相同部分移除, 下面是考题原话
需要特别注意的是,拼接过程中重复的部分是相对前面已经拼接了的字符串而言的
- 刚审题时也有很多奇怪想法, 后来仔细思考了下, 先不说这个算法写出来能干啥使, 就本题而言, 实际计算过程其实关键点只有两步
- 这里假设三个字符串分别为: A , B , C
- 用B的第一位对比A的最后一位, 相同则A和B均把此字符剔除
- 提出B的第一个字符做一个flag, 遍历向下对比时要判断下一个字符是否与我立的flag相同,相同则继续执行,否则跳出
- 继续第四步, 用B的第二位对比A的倒数第二位,相同则剔除
- 重复456, 5应该放在第一步吧, 实际步骤是: 546;
- 处理完成后,得到的结果应为N个输入的字符串, 相加即可得到答案
实例代码
<?php
function merge(...$str){
$num = func_num_args();
$list = func_get_args();
foreach ($list as $k => $v) {
if(isset($list[$k+1])){
$a = str_split($list[$k]);
$b = str_split($list[$k+1]);
$flag = $b[0];
$a_unset = [];
$b_unset = [];
foreach ($b as $k1 => $v1) {
$a_k = count($a)-1-$k1;
if($v1 != $flag) break;
if($v1 == $a[$a_k]){
$a_unset[] = $a_k;
$b_unset[] = $k1;
}
}
foreach ($a_unset as $ka => $va) {
unset($a[$va]);
}
foreach ($b_unset as $kb => $vb) {
unset($b[$vb]);
}
$list[$k] = implode('',$a);
$list[$k+1] = implode('',$b);
}
}
$res = '';
// var_dump($list);
foreach ($list as $key => $value) {
$res .= $value;
}
return $res;
}
$res = merge('ab','ba','aa');
// $res = merge('aabbcc','ccbbaa');
var_dump($res);
代码只是做了两个验证证明结果, 没有继续优化
至于实用性嘛… 算了, 考题哪有实用性这一说…
仅此记录.