import java.lang.reflect.Field;
public class Main {
public static void main
(String[] args
) { test("foo", "foo", true);
test("foo", "foobar", true);
test("oob", "foobar", true);
test("oobar", "foobar", true);
test("barbar", "foobar", false);
test("blip", "foo", false);
test("", "troll", true);
test("foo", "", false);
test("test", "testing", true);
test("dog", "cat", false);
test("test", "Testing", false);
}
private static void test
(String needle,
String haystack,
boolean expected
) { boolean isSubstring = isSubstring(needle, haystack);
if (isSubstring != expected) {
System.
out.
println("You're fired!"); }
System.
out.
printf("\"%s\" contained in \"%s\"? %b expected: %b%n", needle, haystack, isSubstring, expected
); }
public static boolean isSubstring
(String needle,
String haystack
) {
if (haystack.length() < needle.length()) {
return false;
}
char[] needleChars = getCharArray(needle);
char[] haystackChars = getCharArray(haystack);
for (int i = 0; i < haystack.length(); i++) {
if (isSubstringAtPosition(needleChars, haystackChars, i)) {
return true;
}
}
return false;
}
private static boolean isSubstringAtPosition(char[] needle, char[] haystack, int haystackPosition) {
if (needle.length > (haystack.length - haystackPosition)) {
return false;
}
for (char c : needle) {
if (haystack[haystackPosition++] != c) {
return false;
}
}
return true;
}
public static char[] getCharArray
(String string
) { try {
value
= String.
class.
getDeclaredField("value"); value.setAccessible(true);
return (char[]) value.get(string);
e.printStackTrace();
e.printStackTrace();
e.printStackTrace();
e.printStackTrace();
}
}
}
aW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwoKcHVibGljIGNsYXNzIE1haW4gewoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICB0ZXN0KCJmb28iLCAiZm9vIiwgdHJ1ZSk7CiAgICAgICAgdGVzdCgiZm9vIiwgImZvb2JhciIsIHRydWUpOwogICAgICAgIHRlc3QoIm9vYiIsICJmb29iYXIiLCB0cnVlKTsKICAgICAgICB0ZXN0KCJvb2JhciIsICJmb29iYXIiLCB0cnVlKTsKICAgICAgICB0ZXN0KCJiYXJiYXIiLCAiZm9vYmFyIiwgZmFsc2UpOwogICAgICAgIHRlc3QoImJsaXAiLCAiZm9vIiwgZmFsc2UpOwogICAgICAgIHRlc3QoIiIsICJ0cm9sbCIsIHRydWUpOwogICAgICAgIHRlc3QoImZvbyIsICIiLCBmYWxzZSk7CiAgICAgICAgdGVzdCgidGVzdCIsICJ0ZXN0aW5nIiwgdHJ1ZSk7CiAgICAgICAgdGVzdCgiZG9nIiwgImNhdCIsIGZhbHNlKTsKICAgICAgICB0ZXN0KCJ0ZXN0IiwgIlRlc3RpbmciLCBmYWxzZSk7CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0KFN0cmluZyBuZWVkbGUsIFN0cmluZyBoYXlzdGFjaywgYm9vbGVhbiBleHBlY3RlZCkgewogICAgICAgIGJvb2xlYW4gaXNTdWJzdHJpbmcgPSBpc1N1YnN0cmluZyhuZWVkbGUsIGhheXN0YWNrKTsKICAgICAgICBpZiAoaXNTdWJzdHJpbmcgIT0gZXhwZWN0ZWQpIHsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJZb3UncmUgZmlyZWQhIik7CiAgICAgICAgfQogICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJcIiVzXCIgY29udGFpbmVkIGluIFwiJXNcIj8gJWIgZXhwZWN0ZWQ6ICViJW4iLCBuZWVkbGUsIGhheXN0YWNrLCBpc1N1YnN0cmluZywgZXhwZWN0ZWQpOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N1YnN0cmluZyhTdHJpbmcgbmVlZGxlLCBTdHJpbmcgaGF5c3RhY2spIHsKCiAgICAgICAgaWYgKGhheXN0YWNrLmxlbmd0aCgpIDwgbmVlZGxlLmxlbmd0aCgpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGNoYXJbXSBuZWVkbGVDaGFycyA9IGdldENoYXJBcnJheShuZWVkbGUpOwogICAgICAgIGNoYXJbXSBoYXlzdGFja0NoYXJzID0gZ2V0Q2hhckFycmF5KGhheXN0YWNrKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhheXN0YWNrLmxlbmd0aCgpOyBpKyspIHsKICAgICAgICAgICAgaWYgKGlzU3Vic3RyaW5nQXRQb3NpdGlvbihuZWVkbGVDaGFycywgaGF5c3RhY2tDaGFycywgaSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKCiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1N1YnN0cmluZ0F0UG9zaXRpb24oY2hhcltdIG5lZWRsZSwgY2hhcltdIGhheXN0YWNrLCBpbnQgaGF5c3RhY2tQb3NpdGlvbikgewogICAgICAgIGlmIChuZWVkbGUubGVuZ3RoID4gKGhheXN0YWNrLmxlbmd0aCAtIGhheXN0YWNrUG9zaXRpb24pKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgZm9yIChjaGFyIGMgOiBuZWVkbGUpIHsKICAgICAgICAgICAgaWYgKGhheXN0YWNrW2hheXN0YWNrUG9zaXRpb24rK10gIT0gYykgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgY2hhcltdIGdldENoYXJBcnJheShTdHJpbmcgc3RyaW5nKSB7CiAgICAgICAgRmllbGQgdmFsdWU7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdmFsdWUgPSBTdHJpbmcuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgidmFsdWUiKTsKICAgICAgICAgICAgdmFsdWUuc2V0QWNjZXNzaWJsZSh0cnVlKTsKICAgICAgICAgICAgcmV0dXJuIChjaGFyW10pIHZhbHVlLmdldChzdHJpbmcpOwogICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICB9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIm9vcHMiKTsKICAgIH0KfQo=