bbs.thinkzhu.com

?找回密码
?立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2969|回复: 2
打印 上一主题 下一主题

4月10日-在字符串中找到第一个只出现一次的字符

[复制链接]

170

主题

267

帖子

1539

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1539
跳转到指定楼层
楼主
发表于 2014-4-10 09:24:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在一个字符串中找到第一个只出现一次的字符(不考虑多字节字符)。如输入abaccdeff,则输出b。??
如有疑问,请加入四脚猫PHP高级群:??157815728,与高手交流。

170

主题

267

帖子

1539

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1539
沙发
?楼主| 发表于 2014-4-11 09:33:31 | 只看该作者
hello__lemon的左右找算法很巧妙!
1
2
3
4
5
6
7
8
9
10
11
$str = 'aabbccdeffd';
$len = strlen($str);
for ($i = 0; $i < $len; $i++) {
? ? if (strpos($str, $str[$i]) == strrpos($str, $str[$i])) {
? ?? ???$rs = $str[$i];
? ?? ???break;
? ? }
}
echo $rs;
//end of file

风兮蜻蜒的暂存算法比较完善,没有这样的字符都考虑到了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

function find( $str )
{
? ? $cache = array(); // 暂存已查找过的字符
? ? $len = strlen( $str );
? ? for( $i = 0; $i < $len; $i ++ )
? ? {
? ?? ???$c = $str[ $i ];
? ?? ???if( !in_array( $c, $cache ) && strpos( $str, $c, $i + 1 ) === false )
? ?? ???{
? ?? ?? ?? ?return $c;
? ?? ???}
? ?? ???$cache[] = $c; // 暂存
? ? }
? ? return ''; // 没有这样的字符
}

$rs = find( 'aabbzcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxy' );
var_dump( $rs );

花蛋在我家真是字符串函数的高手,2句话搞定了!
1
2
3
4
5
6
$str = 'acdbcaefasssaa';
if(strlen($str) > 0){
? ? $str = array_search( 1, array_count_values(str_split($str, 1)));
? ? print_r($str);
}

月之天宇_25124的算法也是很巧妙的利用了缓存来对比。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//phpinfo();
$str = "aabccdefzg";
$str2 = "ldsdfjgrtgndfsfdhgjelrfgf";
function get_unique_char($str) {
? ? $len = strlen($str);
? ? $first_arr = array();
? ? $char_arr = array();
? ? for ($i = 0; $i < $len; $i++) {
? ?? ???if (!isset($char_arr[$str[$i]])) {
? ?? ?? ?? ?$char_arr[$str[$i]] = $str[$i];
? ?? ?? ?? ?$first_arr[$str[$i]] = $str[$i];
? ?? ???} else {
? ?? ?? ?? ?unset($first_arr[$str[$i]]);
? ?? ???}
? ? }
? ? return current($first_arr);
}
$first_char = get_unique_char($str);
echo "########## $first_char ###########";
$first_char = get_unique_char($str2);
echo "########## $first_char ###########";

yuwend的substr_count方法也不错!
1
2
3
4
5
6
7
8
9
$string = "abaccdeff";
$length = strlen($string);
for ($i = 0; $i < $length; $i++) {
? ? if (substr_count($string, $string {
? ?? ???$i
? ? }) == 1) return $string {
? ?? ???$i
? ? };
}

如有疑问,请加入PHP高级群: 157815728与高手交流。

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

本版积分规则

QQ|小黑屋|手机版|Archiver|bbs.thinkzhu.com ( 京ICP备14043241号 )

Powered by Discuz! X3.4?? 2001-2012 Comsenz Inc.

GMT+8, 2019-10-10 12:26 , Processed in 0.054173 second(s), 22 queries .

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