判断字符串是否唯一?

判断字符串是否唯一?

  • 判断字符串是否唯一?

实现一个算法,确定一个字符串 s 的所有字符是否全都不同。

示例 1:
输入: s = "abcdeff"
输出: false 

示例 2:
输入: s = "abc"
输出: true

思路1:根据字符集大小定义一个合理的数组arr例如,ASCII 256,定义个256大小的数组,遍历字符串s,设置s[i]++,最后统计arr长度,跟s的长度对比,一样则返回true,否则返回false。时间复杂度O(n);空间复杂度O(n)

思路1本质上是使用hashmap这种数据结构来计算一个字符串是否重复,PHP数组即可实现,是不是很方便
思路1缺点:需要遍历整个字符串,例如aabcdef,不能在s[1]就发现重复,返回

PHP语言实现

//PHP语言实现
class Solution {

    /**
     * @param String $astr
     * @return Boolean
     */
    function isUnique($astr) {
        $temp=[];
        $lenth=strlen($astr);
        for($i=0;$i<$lenth;$i++){
            if(isset($temp[$astr[$i]])){
                $temp[$astr[$i]]++;
            }else{
                $temp[$astr[$i]]=1;
            }
        }
        $count=count($temp);
        if($count==$lenth){
            return true;
        }else{
            return false;
        }
    }   
}

思路1改进版PHP

//PHP语言实现
class Solution {

    /**
     * @param String $astr
     * @return Boolean
     */
    function isUnique($astr) {
        $temp=[];
        $lenth=strlen($astr);
        for($i=0;$i<$lenth;$i++){
            if(isset($temp[$astr[$i]])){
               return false;
            }else{
                $temp[$astr[$i]]= true;
            }
        }
        return true;
    }   
}

Golang实现

//GO语言实现
//使用map,类似PHP的key value数组
func isUnique(astr string) bool {
	var arrMap map[string]bool
	arrMap = make(map[string]bool)
	for i := 0; i < len(astr); i++ {
		if arrMap[string(astr[i])] {
			return false
		}
		arrMap[string(astr[i])] = true
	}
	//for k,v := range arrMap{
	//	fmt.Println(k,v)
	//}
	return true
}

如果字符集在ASCII码,则可以使用一个256大小的bool数组来实现

//GO语言实现
//使用切片数组
func isUnique(astr string) bool {
	strLen := len(astr)
	var arr []bool = make([]bool, 256)

	for i := 0; i < strLen; i++ {
		if arr[astr[i]] == true {
			return false
		}
		arr[astr[i]] = true
	}
	return true
}

还有一种节省空间的使用方法,通过位运算来实现

例如ASCII字符可以使用一个长度为8的int数组arr[8]来表示(先不考虑arr[0])(int 4个字节,共32位二进制,通过二进制上的0、1表示一个数是否存在)
例如字符b对应的ASCII码是98,98/32=3;98%32=2;可以用arr[3]所在整数对应的二进制的第2位来表示

//GO语言实现
//使用位运算,减少空间使用
func isUnique(astr string) bool {
	strLen := len(astr)
	var arr = make([]int, 8)
	for i := 0; i < strLen; i++ {
		var idx int = int(astr[i] / 32)
		var shift int = int(astr[i] % 32)
		if (arr[idx] & (1 << shift)) != 0 {
			return false
		}
		arr[idx] |= 1 << shift
	}
	return true
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值