字符串系列——Immediate Decodability

本文介绍了一种算法,用于判断一组二进制编码是否具有即时解码性,即任一编码都不是其他编码的前缀。通过使用strstr函数简化了代码实现,并分享了从超时到AC的调试过程。

 Immediate Decodability 

An encoding of a set of symbols is said to be immediately decodable if no code for one symbol is the prefix of a code for another symbol. We will assume for this problem that all codes are in binary, that no two codes within a set of codes are the same, that each code has at least one bit and no more than ten bits, and that each set has at least two codes and no more than eight.


Examples: Assume an alphabet that has symbols {A, B, C, D}


The following code is immediately decodable:


A:01 B:10 C:0010 D:0000


but this one is not:


A:01 B:10 C:010 D:0000 (Note that A is a prefix of C)

Input 

Write a program that accepts as input a series of groups of records from a data file.Each record in a group contains a collection of zeroes and ones representing a binary code for a different symbol. Each group is followed by a single separator record containing a single 9; the separator records are not part of the group. Each group is independent of other groups; the codes in one group are not related to codes in any other group (that is, each group is to be processed independently).

Output 

For each group, your program should determine whether the codes in that groupare immediately decodable, and should print a single output line giving the group number and stating whether the group is, or is not, immediately decodable.


The Sample Input describes the examples above.

Sample Input 

01
10
0010
0000
9
01
10
010
0000
9

Sample Output 

Set 1 is immediately decodable
Set 2 is not immediately decodable

托了好久才又继续刷题,电脑终于买过来了。。。。

废话不说,看题。。。

字符串系列还没刷完,我真是退步了,最近没刷都有点生疏了。。。

这题就是判断所给10串里面有没有某个串是另一串的前缀。

本来思路是截取字符串再对比,不过老是实现不了,字符串这部分有空得复习复习了。。。

后来看网上人家用了一个非常方便的办法,就是strstr函数,判断一个字符串是否包含在另一个字符串里面,返回第一个字符的地址,然后与其第一个字符地址对比

代码大大缩短了。。。


代码(未AC):

#include<iostream>
#include<cstring>
using namespace std;

int main()
{
	int cnt = 1;
	while (1)
	{
		char ch[100][100], tmp;
		int n = 0;

		for (int i = 0; cin >> ch[i]; i++)
		{
			if (strcmp(ch[i], "9") == 0)
				break;
			n++;
		}

		bool jd = true;
		for (int i = 0; i < n; i++)
			for (int j = i + 1; j < n; j++)
				if (strstr(ch[i], ch[j]) == &ch[i][0] || strstr(ch[j], ch[i]) == &ch[j][0])
				{
					jd = false;
					break;
				}

		if (jd)
			cout << "Set " << cnt++ << " is immediately decodable" << endl;
		else
			cout << "Set " << cnt++ << " is not immediately decodable" << endl;
	}
	return 0;
}

Time limit exceeded。。。

测试是没有错误的,但是我检查后发现一个问题就是这程序没有退出点。。。

修改后AC了。。。

#include<iostream>
#include<cstring>
using namespace std;

int main()
{
	int cnt = 1;
	char temp[100];
	while (cin >> temp)
	{
		if (temp[0] == '9')
			break;
		char ch[100][100], tmp;
		int n = 1;
		strcpy(ch[0], temp);

		for (int i = 1; cin >> ch[i]; i++)
		{
			if (strcmp(ch[i], "9") == 0)
				break;
			n++;
		}
		bool jd = true;
		for (int i = 0; i < n; i++)
			for (int j = i + 1; j < n; j++)
				if (strstr(ch[i], ch[j]) == &ch[i][0] || strstr(ch[j], ch[i]) == &ch[j][0])
				{
					jd = false;
					break;
				}

		if (jd)
			cout << "Set " << cnt++ << " is immediately decodable" << endl;
		else
			cout << "Set " << cnt++ << " is not immediately decodable" << endl;
		memset(temp, 0, sizeof(temp));
	}
	return 0;
}

各种不容易啊,有空要多刷了,不能停了。。。。



转载于:https://www.cnblogs.com/java20130723/archive/2013/03/23/3212189.html

### Visual Studio 2019 字符串操作使用指南 在 Visual Studio 2019 中,字符串操作是 C# 和其他支持语言中的核心功能之一。以下是一些常见的字符串操作及其用法: #### 常见字符串操作 1. **字符串连接** 使用 `+` 或 `String.Concat()` 方法可以将多个字符串连接在一起[^1]。 ```csharp string str1 = "Hello"; string str2 = "World"; string result = str1 + " " + str2; // 结果为 "Hello World" ``` 2. **字符串格式化** 可以通过 `String.Format()` 或插值字符串(C# 6.0+)来创建动态字符串[^2]。 ```csharp int number = 42; string formattedString = String.Format("The answer is {0}", number); // "The answer is 42" string interpolatedString = $"The answer is {number}"; // "The answer is 42" ``` 3. **字符串分割** 使用 `String.Split()` 方法可以根据指定的分隔符将字符串拆分为子字符串数组[^3]。 ```csharp string sentence = "apple,banana,cherry"; string[] fruits = sentence.Split(','); // ["apple", "banana", "cherry"] ``` 4. **字符串替换** 使用 `String.Replace()` 方法可以将字符串中的特定部分替换为新内容[^4]。 ```csharp string original = "Hello World"; string replaced = original.Replace("World", "Universe"); // "Hello Universe" ``` 5. **字符串查找** 使用 `String.Contains()`、`String.IndexOf()` 等方法可以检查或定位子字符串的位置[^5]。 ```csharp string text = "Hello World"; bool contains = text.Contains("World"); // true int index = text.IndexOf("World"); // 6 ``` 6. **字符串修剪** 使用 `String.Trim()` 方法可以移除字符串开头和结尾的空白字符[^6]。 ```csharp string trimmed = " Hello World ".Trim(); // "Hello World" ``` 7. **字符串转换** 使用 `ToUpper()` 和 `ToLower()` 方法可以将字符串转换为大写或小写[^7]。 ```csharp string lower = "HELLO".ToLower(); // "hello" string upper = "world".ToUpper(); // "WORLD" ``` #### 调试与诊断 Visual Studio 2019 提供了强大的调试工具,可以帮助开发者检查字符串变量的值和状态。例如,在断点处查看字符串的内容,或者使用即时窗口(Immediate Window)执行临时代码[^8]。 ```csharp string test = "Debugging Strings"; System.Diagnostics.Debug.WriteLine(test); // 输出到输出窗口 ``` #### 性能优化 对于频繁的字符串操作,建议使用 `StringBuilder` 类,因为它避免了每次修改时创建新的字符串对象[^9]。 ```csharp using System.Text; StringBuilder sb = new StringBuilder(); sb.Append("Hello"); sb.Append(" "); sb.Append("World"); string finalString = sb.ToString(); // "Hello World" ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值