编程珠玑(产品篇)

第十一章

关于排序函数
sort1中不断地给t赋相同的初始值,可以利用sot2的方法改进
#include<stdio.h>
void sort1() {
	for(int i =1; i < n; i++) {
		for(int j = i; j > 0 && x[j-1]>x[j]; j--) {
			t = x[j];
			x[j] = x[j-1];
			x[j-1] = t;
		}
	}
}
void sort2() {
	for (int i = 1; i < n; i++) {
		t = x[i];
		for (int j = i; j > 0 && x[j-1] > t; j--)
			x[j] = x[j-1];
		x[j] = t;
	}
}

快速排序,堆排序,二分查找之前已经写过,这里就不写了。
文本中的单词个数统计,可用哈希或者STL中的map。
查找给定字符串中的最长重复子串,利用后缀数组。根据书上的例子实现的代码如下:
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
#include <algorithm>
#define MAXN 1024
char str[MAXN];
char *suffix[MAXN];
bool cmp(char *a, char *b) {
	if (strcmp(a,b) < 0)
		return 1;
	return 0;
}
int comlen(char *a, char *b) {
	int l1 = strlen(a);
	int l2 = strlen(b);
	int i = 0;

	while (i < l1 && i < l2 && a[i] == b[i])
		i++;
	return i;
}
int main() {
	int n = 0;
	int i;
	int maxl = 0;
	scanf("%s", &str);
	n = strlen(str);
	for (i=0;i<n;i++)
		suffix[i] = &str[i];
	
	sort(suffix, suffix + n, cmp);
	for (i=0;i<n;i++)
		printf("%s\n", suffix[i]);

	for (i=0;i<n-1;i++) {
		if (comlen(suffix[i], suffix[i+1]) > maxl) 
			maxl = comlen(suffix[i], suffix[i+1]);
	}

	printf("%d\n", maxl);
	return 0;
}



你可能感兴趣的:(编程珠玑(产品篇))