Arrays_Strings 判断字符串中的字符是否唯一@CareerCup

本文介绍了一种不使用额外数据结构的算法,用于检测字符串中所有字符是否唯一。提供了两种解决方案,一种使用辅助数组,时间复杂度为O(n),空间复杂度为O(1);另一种利用位向量减少空间占用,适用于仅包含小写字母的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文:

Implement an algorithm to determine if a string has all unique characters. What if you can not use additional data structures?

译文:

实现一个算法来判断一个字符串中的字符是否唯一(即没有重复).不能使用额外的数据结构。 (即只使用基本的数据结构)


思路:

1 暴力比较,两个for循环,O(n^2)

2 如果可以改变原字符串的字符,则可以用O(nlogn)排序,然后比较邻居字符是否一样


3 虽然不能用其他数据结构(Hashtable),但可以用array来模拟哈希表。Time: O(n), Space: O(1)

4 如果字符串只包含小写字符或者只包含大写字符,则可以用一个32位的integer代替array。


package Arrays_Strings;

public class S1_1 {

	
	// 第一种方法,开一个辅助数组存放
	// Time O(n), Space O(1)
	public static boolean isUniqueChars(String s) {
		if(s.length() > 256) {		// 预先判断字符串个数,如果超过256,根据抽屉原理,必有重复
			return false;
		}
		
		boolean[] used = new boolean[256];
		for (int i=0; i<s.length(); i++) {
			if(used[s.charAt(i)]) {
				return false;
			}
			used[s.charAt(i)] = true;
		}
		return true;
	}
	
	// 第二种方法,通过bit vector来减少空间
	// 如果字符串只包含小写字符或大写字符,则可以使用,因为26<32
	public static boolean isUniqueChars2(String str) {
		if (str.length() > 256) {
			return false;
		}
		
		int checker = 0;
		for(int i=0; i<str.length(); i++) {
			int val = str.charAt(i) - 'a';
			if((checker & (1<<val)) > 0) {		// 检查checker的左起第i位
				return false;
			}
			checker |= (1<<val);	// 把checker的左起第i位置1
		}
		
		return true;
	}
	
	public static void main(String[] args) {
		String[] words = {"abcde", "hello", "apple", "kite", "padle"};
		for (String word : words) {
			System.out.println(word + ": " + isUniqueChars(word) + " " + isUniqueChars2(word));
		}
	}
}


重新捡起cc150。。。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值