Substring and Subsequence


บทความนี้ จะอธิบายเรื่องของ Substring และ Subsequence ว่ามีความแตกต่างกันยังไง เช่น ABCD มี Substring รวม 10 ตัว ได้แก่
A    B    C    D
AB   BC   CD
ABC  BCD
ABCD
ABCD มี Subsequence รวม 15 ตัว ได้แก่
A AB ABC ABD ABCD AC ACD AD
B BC BCD BD
C CD
D
บางครั้งอาจจะรวม Empty String เข้าเป็น Substring หรือ Subsequence ด้วยก็ได้ โดยสรุปคือ Substring ต้องติดกัน แต่ Subsequence ไม่จำเป็นต้องติดกันก็ได้ เช่น BD เป็น Subsequence ไม่เป็น Substring
ตัวอย่างการหา Palindrome Substring และ Palindrome Subsequence ที่ยาวที่สุดของ ABCABACA
ABCABACA
  xxxxx      => Longest Palindrome Substring
ABCABACA
x xxxxxx     => Longest Palindrome Subsequence
ถ้าเป็น Array มักจะเติมคำว่า Contiguous เข้าไปด้วย เพื่อบอกว่าติดกันหรือไม่
• Contiguous Subsequence Array คือ Substring
• Subsequence Array คือ Subsequence
Substring คล้ายกับ Triangle Number ส่วน Subsequence คล้ายกับ Subset ตัวอย่างของ Triangle Number เช่น
O       1    1
OO      2    3
OOO     3    6
OOOO    4   10
OOOOO   5   15
OOOOOO  6   21

ตัวอย่างการเขียน Code เพื่อสร้าง Substring ทั้งหมด
class Start {
	public static void main(String[] z) {
		char[] a = "ABCD".toCharArray();
		for (int i = 0; i < a.length; i++) {
			String t = "";
			for (int j = i; j < a.length; j++) {
				t += a[j];
				System.out.println(t);
			}
		}
	}
}
ผลลัพธ์
A
AB
ABC
ABCD
B
BC
BCD
C
CD
D

ตัวอย่างการเขียน Code เพื่อสร้าง Subsequence ทั้งหมด แนวคิดคือ สร้างจำนวนเต็มจาก 0 ถึง 2n แล้วแปลงเป็นเลขฐานสอง เพื่อเลือกหรือข้ามตำแหน่งที่ต้องการ
class Start {
	public static void main(String[] z) {
		char[] a = "ABCD".toCharArray();
		int count = 1 << a.length;
		for (int i = 0; i < count; i++) {
			System.out.print(i);
			String t = "";
			for (int j = 0; j < a.length; j++) {
				int p = 1 << a[j] - 1;
				if (p == (p & i)) {
					t += a[j];
				}
			}
			System.out.println(" = " + t);
		}
	}
}
ผลลัพธ์ทั้งหมด 16 ตัว โดยมีตัวแรกสุดคือ Empty String
0 = 
1 = A
2 = B
3 = AB
4 = C
5 = AC
6 = BC
7 = ABC
8 = D
9 = AD
10 = BD
11 = ABD
12 = CD
13 = ACD
14 = BCD
15 = ABCD

แบบฝึกหัด กำหนด String มาให้ เขียน Code เพื่อนับจำนวน Substring ที่พบมากที่สุด เช่น
AABA มี Substring คือ
A
AA
AAB
AABA
A
AB
ABA
B
BA
A
พบ A มากที่สุด ตอบ 3
แบบฝึกหัด กำหนด String มาให้ เขียน Code เพื่อนับความยาวของ Unique Substring ที่สั้นที่สุด เช่น
AABA มี Substring คือ
A     พบ 3 ตัว
AA    พบ 1 ตัว เป็น Unique Substring
AAB   พบ 1 ตัว เป็น Unique Substring
AABA  พบ 1 ตัว เป็น Unique Substring
AB    พบ 1 ตัว เป็น Unique Substring
ABA   พบ 1 ตัว เป็น Unique Substring
B     พบ 1 ตัว เป็น Unique Substring
BA    พบ 1 ตัว เป็น Unique Substring
Unique Substring ที่สั้นที่สุดคือ B ตอบ 1