3258. 统计满足 K 约束的子字符串数量 I

今天的每日一题,标着简单标签,但是感觉并不简单啊,花了差不多1个多小时,快俩小时,交更新六遍代码,,虽然用一个for写出来,但时间复杂度还是N*N,但是改代码过程中有所思考,相比以前有所长进,有收获,有进步。

O(N*N)

		int ans =0;
		List<String> list  =new ArrayList<>();
		for(int i = 0;i<s.length();i++){
			for(int j = i;j<s.length();j++){
				list.add(s.substring(i,j+1));
			}
		}
		System.err.println(list);
		for (int i = 0; i < list.size(); i++) {
			int ones = 0;
			int zeros = 0;
			char[] chars = list.get(i).toCharArray();
			for (int j = 0; j < chars.length; j++) {
				if(chars[j] == '1') ones++;
				else if (chars[j] == '0') zeros++;
				if(ones >k && zeros>k){ ans++;break;}
			}
		}
	



		return list.size() -ans;
class Solution {
    public int countKConstraintSubstrings(String s, int k) {
       int ans = 0;
		int sum = 0;
		
		for (int i = 0; i < s.length(); i++) {
			sum += i + 1;
			for (int j = i; j < s.length(); j++) {
				int ones = 0;
				int zeros = 0;
				char[] chars = s.substring(i, j + 1).toCharArray();
				for (int n = 0; n < chars.length; n++) {
					if (chars[n] == '1')
						ones++;
					else if (chars[n] == '0')
						zeros++;
					if (ones > k && zeros > k) {
						ans++;
						break;
					}
				}
			}
		}

		return sum - ans;
    }
}
​
for (int i = 0; i < s.length(); i++) {
			    sum += i + 1;
				int ones = 0;
				int zeros = 0;
/*和上边代码不同的是,没注意到char[] chars = s.substring(i, s.length()).toCharArray(); 这个函数耗时多,但是每次for都会执行,这次移到了外边从21ms-->4ms*/
				char[] chars = s.substring(i, s.length()).toCharArray();
				
				for (int n = 0; n < chars.length; n++) {
					if (chars[n] == '1')
						ones++;
					else if (chars[n] == '0')
						zeros++;
					if (ones > k && zeros > k) {
						ans+=chars.length-n;
						break;
					}
				}
			}

​
char[] chars=s.toCharArray();//更进一步直接在搞到外边,但是这时候 4--》2 ms
		for (int i = 0; i < s.length(); i++) {
			    sum += i + 1;
				int ones = 0;
				int zeros = 0;
				for (int n = i; n < s.length(); n++) {
					if (chars[n] == '1')
						ones++;
					else if (chars[n] == '0')
						zeros++;
					if (ones > k && zeros > k) {
						ans+=s.length()-n;
						break;
					}
				}
			}
最后一舞,搞了好长时间,也算有点收获,没白琢磨
int ans = 0;
		int sum = 0;
		char[] chars = s.toCharArray();
		int ones = 0;
		int zeros = 0;
		for(int i = 1;i<=s.length();i++) sum+=i;
		for (int i = 0, r = i; i < s.length() && r < s.length();) {
			if (chars[r] == '1')
				ones++;
			else if (chars[r] == '0')
				zeros++;
			
			if (ones > k && zeros > k) {
				ones = 0;
				zeros = 0;
				ans += s.length() - r;
				i++;
				r = i;
				continue;
			}
			if (r + 1 == s.length()) {
				i++;
				r = i;
				ones = 0;
				zeros = 0;
				continue;
			}
			r++;
			
		}
		
			return sum - ans;

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值