解答:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//
// f(i, j) = f(i, j-1) + (s[j-1] == t[i-1] ? f(i-1,j-1) : 0)
//
int numDistinct(char* s, char* t) {
size_t sl = strlen(s), tl = strlen(t), i, j;
int** c = calloc(tl+1, sizeof(int *));
for (i = 0; i <= tl; i++) {
c[i] = calloc(sl+1, sizeof(int *));
}
for (i = 0; i <= sl; i++) {
c[0][i] = 1;
}
for (i = 1; i <= tl; i++) {
for (j = i; j <= sl; j++) {
if (t[i-1] == s[j-1]) {
c[i][j] = c[i-1][j-1];
}
c[i][j] += c[i][j-1];
}
}
return c[tl][sl];
}
文章:http://www.buyya.com/254/Patterns/Factory-2pp.pdf
对比了Factory Method
和Abstract Factory
的异同。
**创建模式(Creational Patterns)**抽象了创建过程,解少了业务逻辑和具体对象的耦合。具体又分:
- 类创建模式(class creational patterns),使用继承决定创建具体对象,也就是Factory Method
- 对象创建模式(object creational patterns),使用组合的方式委托给另外一个对象创建具体对象,也就是Abstract Factory
不同点:
- Factory Method通常用于创建一个对象,而Abstract Factory创建一组相关联的对象
- Factory Method通过继承复写(overwrite)的形式,依赖子类完成具体的对象创建,而Abstract Factory通过定义一个创建多个相关对象的接口,组合接口的实现来完成具体对象的创建,而这个接口的实现中页常常使用Factory Method
SRP(单一职责原则)
一个面向对象设计原则:一个函数、类、模块有且仅有一个修改的理由。
这个原则的好处显而易见,任何修改只会涉及到很少的代码,因此维护性很高,各个模块之间耦合度很低。但是,这个原则很简单但是又不容易做到,原因在于职责这个概念很难量化,同时在实现过程中由于团队、项目背景等等原因迫使必须违背这个原则。经验是:接口一定要遵循,具体实现类尽可能遵循。
王垠的如何掌握所有的程序语言
掌握一门编程语言,重点是掌握它的语言特性。比如,掌握Golang,你应当掌握defer
,goroutine
,channel
,iota
等等特性,而不是具体的语法。