Suppose your two strings are first and last names. Your data looks like this:
label, firstname, lastname
1, 'Tom', 'Jones'
0, 'Bob', 'Dylan'
1, 'Bob', 'Jones'
Your bigram—or interaction term firstname * lastname
—would be
label, ..., fullname
1, ..., 'Tom Jones'
0, ..., 'Bob Dylan'
1, ..., 'Bob Jones'
Now, when you run your classification algorithm, your data will need to take this form (usually the data format is automatically converted to this in your program, such as R):
label, Tom, Jones, Bob, Dylan, TomJones, BobDylan, BobJones
1, 1, 1, 0, 0, 1, 0, 0
0, 0, 0, 1, 1, 0, 1, 0
1, 0, 1, 1, 0, 0, 0, 1
Since we have more than one "Bob" (i.e. both "Bob Dylan" and "Bob Jones"), then the variable "Bob" is not perfectly correlated with "Bob Dylan". Therefore, the classification algorithm is able to use the variation of "Bob", and "Bob Dylan" to predict the label.
However, "Tom" is perfectly correlated with "Tom Jones", since there are other people who have the first name "Tom" in the data. Therefore, the classification algorithm cannot use both "Tom", and "Tom Jones". Instead, it can only use one or the other.
Since you'd like to use all the available information you have (i.e. firstname, lastname and fullname), but you don't know which firstnames/lastnames are perfectly correlated with fullname, then you should use a ridge regression because this type of regression can deal with perfectly correlated independent variables. Example code (in R) looks like this:
library(glmnet)
df <- read.csv(...)
X <- sparse.model.matrix(~firstname + lastname + firstname*lastname, df)
y <- df$label
fit <- cv.glmnet(X, y, family='binomial', alpha=0)
predictions <- predict(fit, X, type='response')