【PHP】给两个字符串返回字符串按排序出两个字符串的字符de多种解法

问题描述

给出两个字符串s1和s2,两个字符串仅包含a-z,返回一个排序后的字符串,包含这两个字符串的内容,每个字母只出现一次。

举例:

a = "xyaabbbccccdefww" b = "xxxxyyyyabklmopq"
longest(a, b) -> "abcdefklmopqwxy"

a = "abcdefghijklmnopqrstuvwxyz"
longest(a, a) -> "abcdefghijklmnopqrstuvwxyz"

分析&解决

涉及到的问题

  • 排序
  • 去重

按数组的方式

  1. 把两个字符串转化成数组
  2. 对数组进行去重和排序
function longest($a, $b) {
    //转化成数组
    $arr_a = str_split($a);
    $arr_b = str_split($b);
    //数组合并
    $arr_me = array_merge($arr_a,$arr_b);
    //数组去重
    $arr_me = array_unique($arr_me);
    //数组排序
    array_multisort($arr_me);
    //转换成字符串
    return  implode($arr_me);
}

count_chars()

count_chars() 函数返回字符串中所用字符的信息(例如,ASCII 字符在字符串中出现的次数,或者某个字符是否已经在字符串中使用过)。

count_chars(string,mode)

string  必需。规定要检查的字符串。
mode
可选。规定返回模式。默认是 0。以下是不同的返回模式:
0 - 数组,ASCII 值为键名,出现的次数为键值
1 - 数组,ASCII 值为键名,出现的次数为键值,只列出出现次数大于 0 的值
2 - 数组,ASCII 值为键名,出现的次数为键值,只列出出现次数等于 0 的值
3 - 字符串,带有所有使用过的不同的字符
4 - 字符串,带有所有未使用过的不同的字符

这里用3

解决代码

function longest($a, $b) {
    return count_chars($a.$b, 3);
}

正则表达式

解决代码

function longest($a, $b) {
    $c = str_split($a.$b); sort($c);
    $e = preg_replace('/(\w)\1+/', "$1", implode("", $c));
    return $e;
}

前面完成的还是之前的方法中的转化数组、排序数组的过程,正则表达式的作用是字符串的去重。

总结

  • 一个问题出现必定会有不同的解决思路
  • 条条大路通罗马
  • 大量数据计算下可以比较出哪种方法更快
时间: 2024-11-01 14:44:31

【PHP】给两个字符串返回字符串按排序出两个字符串的字符de多种解法的相关文章

【PHP】字符串去空格并将每个单词首字母转换成大写de多种解法

问题描述 编写camel_case方法,实现将字符串去掉空格,并将每个单词的第一个字母转换成大写. 例如: camel_case("hello case"); // => "HelloCase" camel_case("camel case word"); // => "CamelCaseWord" 分析 ucfirst 数组 解决方案 数组元素转换大写 function camel_case(string $s)

算法 优化-编写一个函数,该函数将筛选出两个字符串参数中相同的字符,并按字母序进行排序后返回

问题描述 编写一个函数,该函数将筛选出两个字符串参数中相同的字符,并按字母序进行排序后返回 本题是某欧外企面试题,下面给出一个我当时的C语言解法,希望请教各位高手们更为高效的解法. char *func(const char *s1, const char *s2) { char temp[256];//ascii_table memset(temp, 0, sizeof(temp)); char *p1 = s1, *p2 = s2; int len = 0; for(; *p1!=0; p1

android如何获取网页中特定标记之间的代码并作为字符串返回?

问题描述 android如何获取网页中特定标记之间的代码并作为字符串返回? 比如 我要获取某个网页上fhh jkl 这两个标记之间的代码 并返回该怎么弄? 解决方案 正则表达式提取 (?<=fhh).*?(?<jkl) 解决方案二: 除了用正则之外你也可以用Jsoup提取

js中判断由字符串from和to代表的两个日期的先后关系

js|字符串 /** * 判断由字符串from和to代表的两个日期的先后关系. * @param from 满足yyyy-MM-dd HH:mm日期格式的字符串 * @param to 满足yyyy-MM-dd HH:mm日期格式的字符串 * @return -1 : from > to * @return 0 : from = to * @return 1 : from to.charAt(i)) { rValue = -1 ; break ; } } return rValue ;}func

c语言-求教编写一个函数求出两个字符串包含的相同的单词

问题描述 求教编写一个函数求出两个字符串包含的相同的单词 编写一个函数,函数首部为void maxword(char *s,char *t),求出两个字符串包含的相同单词(同一字母的大小写视为不同的字符).规定单词全部由英文字母构成,单词直接由一个或多个空格分隔.其中主函数如下: #include Void main() { Char s[]="This is C programming text"; Char t[]="This is a text for C progra

数据结构 算法-如何用java中串的操作方法找出两个字符串中所有共同的字符

问题描述 如何用java中串的操作方法找出两个字符串中所有共同的字符 通过实现对串的基本操作的算法设计,运用模式匹配算法KMP和Brute-Force,展出两个字符串中所有共同的字符,判断一个字符串是否为E-mail地址

java中字符串转换为字节数组请问用什么方法,字符串返回字节数组怎么做?

问题描述 java中字符串转换为字节数组请问用什么方法,字符串返回字节数组怎么做? java中字符串转换为字节数组请问用什么方法,字符串返回字节数组怎么做? 解决方案 http://blog.csdn.net/shuaihj/article/details/7478773http://blog.csdn.net/abin_gha/article/details/6317850 解决方案二: java中String类有getBytes方法,可以将字符串转成字节数组.字节数组可以直接写入到输出流中,

js判断出两个字符串最大子串的函数实现方法_javascript技巧

如下所示: <!DOCTYPE html> <html> <head> <title></title> </head> <script type="text/javascript"> function search(str1,str2) { var i=j=k=a=jk=kk=0; var m=str1.length; var n=str2.length; var index=0; var maxlen

c语言 字符串 返回值-C语言 字符串复制 函数返回值问题

问题描述 C语言 字符串复制 函数返回值问题 函数是为了将一个字符串复制一部分到另一个字符串.麻烦看下我函数里边的注释,即我直接用string1做返回值,而不用string.返回的结果不一样.这里有个疑问,string2不是已经被存在string1里面了吗,为什么还要string? 代码如下: #include char *strncpy(char *, char *,int ); int main(void) { char string1[30]="Hello,Jim."; char