我想知道如何做出以下决定?
A. 空字符串是否被视为以下内容的子字符串:
- 另一个空字符串
- 非空字符串
B. 空字符串是否被认为是以下的排列:
- 另一个空字符串
您可以自己测试前两个contains
:
/* 1 */ System.out.println("".contains(""));
/* 2 */ System.out.println("abc".contains(""));
真的 真的
至于你的最后一个问题,它似乎类似于询问空集的排列有多少?, 答案是0! = 1
- 即是的,空集是自身的排列,因此在数学意义上,空字符串可以被认为是自身的排列。
我不知道您想到的置换实现是什么,但总的来说,是的,基于空是空的子集这一事实,您应该期望空字符串是另一个空字符串的有效置换。
String foo = "hello!";
String bar = "world";
String baz = "";
String qux = "wor";
String ipsem = "";
System.out.println(foo.contains(bar)); //false
System.out.println(foo.contains(baz)); //true
System.out.println(baz.contains(foo)); //false
System.out.println(bar.contains(qux)); //true
System.out.println(baz.contains(ipsem)); //true
用 Junit写一些真实的测试!
还要小心interned Strings,最后一个测试isNotConsideredIdenticalVariable
需要一个技巧来停止编译器优化(即自动实习)。
import org.junit.Assert;
import org.junit.Test;
public class EmptyStringTest {
@Test
public void isConsideredSubstringOfEmpty() throws Exception
{
Assert.assertTrue("".contains(""));
}
@Test
public void isConsideredSubstringOfNonEmpty() throws Exception
{
Assert.assertTrue("NOT EMPTY".contains(""));
}
@Test
public void isConsideredEqual() throws Exception
{
Assert.assertEquals("", "");
}
@Test
public void isConsideredIdenticalLiteral() throws Exception
{
Assert.assertTrue("" == "");
}
@Test
public void isNotConsideredIdenticalVariable() throws Exception
{
String firstInstance = "a".replaceAll("a", "");
String differentInstance = "";
Assert.assertFalse(differentInstance == firstInstance);
}
}
由于您使用标签“java”询问此问题,因此我假设您指的是String
类型。
Java 空String
可以被认为是另一个空或非空 String ... 的子字符串,因为它可以使用String.substring()
. (并非所有空字符串实例都可以通过这种方式生成,但如果您使用 比较字符串equals
,则不相关......)
Java String
API 没有定义permute
操作。这意味着我们无法说出它的行为方式。问题的第二部分无法回答。
如果您在谈论字符串是什么的其他模型,那么答案完全取决于模型。
如果您(实际上)接受有关如何为字符串建模的建议……那么我认为您的问题无法回答。同样,答案将取决于您如何定义字符串模型的其余部分。
但是,如果您需要我的建议,那么您需要考虑如何使用字符串模型。字符串的子字符串集包含原始字符串是否有用?字符串的排列集包含原始字符串是否有用?逻辑后果是什么...
最后,这个 Wikipedia 页面包含了字符串的“形式理论”。在我非数学家的眼中,它看起来不错,但该页面没有引用任何似乎与形式理论部分相关的参考资料。